Как передать строку в модель представления при инициализации?IOS

Программируем под IOS
Anonymous
Как передать строку в модель представления при инициализации?

Сообщение Anonymous »

У меня есть приложение для iOS со следующими представлениями:

Код: Выделить всё

struct LoggedInUserView: View{
@ObservedObject var viewModel: LoggedInUserViewModel
@StateObject var sharedPortionViewModel: SharedPortionViewModel(userName: "")
var body: some View{
//Some specific-to-LoggedInUser UI elements
SharedPortionUserView(sharedPortionViewModel: sharedPortionViewModel)
}
}

struct OtherUserView: View{
@ObservedObject var viewModel: OtherUserViewModel()
@StateObject var sharedPortionViewModel: SharedPortionViewModel(userName: "")
var body: some View{
//Some specific-to-OtherUser UI elements
SharedPortionUserView(sharedPortionViewModel: sharedPortionViewModel)
}
}

Код: Выделить всё

SharedPortionViewModel
выполняет одни и те же функции для загрузки данных в обоих случаях, но захватывает информацию указанного пользователя, в зависимости от того, какое представление просматривается. В 100% случаев просмотра LoggedInUserView будет передаваться имя пользователя вошедшего в систему пользователя. Это хранится в Keychain.
Все, что я пытаюсь сделать, это передать имя пользователя соответствующего пользователя при создании StateObject в обоих случаях, но я нахожу это на удивление сложным. делать. Различные подходы, которые я видел, включают в представление собственные инициализаторы, которых мне хотелось бы избежать. Я также рассматривал что-то вроде:

Код: Выделить всё

var passedUserName: String //tried a variety of different property wrappers
@StateObject var sharedPortionViewModel: SharedPortionViewModel(userName: passedUserName)
Таким образом, родительское представление может передавать рассматриваемое имя пользователя при загрузке этого представления, но я думаю, что есть проблемы с passUserName, который не устанавливается при инициализации, чтобы быть готовым к передаче в SharedPortionViewModel.
Я также рассмотрел возможность изменения описанного выше подхода:

Код: Выделить всё

@State private var sharedProfileViewModel: SharedUserProfilePageViewModel?
А затем инициализируем его с помощью

Код: Выделить всё

.onAppear {
if sharedProfileViewModel == nil {
sharedProfileViewModel = SharedUserProfilePageViewModel(userName: userName)
}
}
Но это просто странно.
Я мог бы создать модель представления перед инициализацией навигации из родительского представления, а затем передать ее как уже Created-ViewModel, но это выглядит неуклюже.
Я что-то упустил? Почему это так важно? Действительно ли это единственные способы добиться этого? Я описал лучший подход выше и неправильно отклонил его?

Подробнее здесь: https://stackoverflow.com/questions/786 ... ialization

Вернуться в «IOS»