Как передать строку в модель представления при инициализации?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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