Сценарий: у меня есть список сообщений пользователей, где список содержит лишь небольшую часть информации о каждом сообщении с учетом требований к размеру. покажи список. При нажатии на каждое сообщение в списке можно расширить индивидуальную информацию, что отправляет пользователя на новую страницу, где подробно описывается только это сообщение.
Похоже, что в этой ситуации учитывая, что появился новый экран с новым пользовательским интерфейсом и бизнес-логикой, для модели представления следует использовать @stateobject для этой страницы подробного сообщения, поскольку именно это новое представление отвечает за визуализацию и перемещение этот конкретный набор данных. Первый вопрос - просто проверить это понимание... это лучше всего подходит для @stateobject, а не для @observedobject, верно? (Я не хочу использовать @environmentObject, потому что только это представление будет иметь доступ к этим данным, они не должны быть доступны для всего приложения).
Предполагая, что мой @stateobject -for-detailed-page-viewmodel верен, тогда я столкнулся со следующей проблемой. Поскольку объект состояния viewmodel будет способствовать получению данных с сервера, специфичных для выбранной записи родительского просмотра, он должен получить postID с предыдущей страницы перед своей инициализацией. Согласно ответу в этом сообщении, который ссылается на документы Apple, инициализация postID с помощью пользовательской инициализации в представлении для облегчения перехода к модели представления является хорошей практикой следующим образом:
Код: Выделить всё
struct DetailedPostPage: View {
@StateObject private var detailedPostViewModel: DetailedPostViewModel
init(postID: String) {
self.detailedPostViewModel = .init(wrappedValue: .init(postID: passedPostID))
_detailedPostViewModel = StateObject(wrappedValue: DetailedPostViewModel(postID: postID))
}
}
Однако я видел другой ответ на В отдельном вопросе говорится, что мне следует избегать пользовательских инициализаций в представлении, чтобы избежать негативного влияния на различия.
Это меня смутило. Кажется, нет никакого способа установить собственную инициализацию в представлении для модели представления stateobject, для которой требуется переданная строка. Нужно ли мне избегать этих пользовательских инициализаций или нет? Если мне это не нужно, и это на самом деле лучшая практика для этого сценария, как мне узнать, в каких сценариях его не использовать?
Изменить: этот вопрос здесь несколько похож, но не совсем мой случай... хотя ответ предполагает, что мой _detailedPostViewModel = StateObject(... может привести к странному поведению... поэтому этого следует избегать? Но как мне это сделать?
Подробнее здесь: https://stackoverflow.com/questions/787 ... lies-on-pa