и кодом документации Apple здесь: https://developer.apple.com/documentation/swiftui/ Управление Model-Data-in-your-app
В приложении Swiftui следует использовать обертку свойства @stateobject , когда представление экстремирует сам объект, так что объект не будет воссоздан во время обновления представления.
Тем не менее, есть тонкая линия, которая делает ее немного неясной: что, если объект создается где -то еще, но «введен» для представления < /code>, а затем представление является единственным владельцем / держатель этого объекта? Должен ли это быть @StateObject или @ObservedObject ?
Код: Выделить всё
import SwiftUI
import Combine
import Foundation
struct ViewFactory {
func makeView() -> some View {
let viewModel = ViewModel()
return NameView(viewModel)
}
}
final class ViewModel: ObservableObject {
@Published var name = ""
init() {}
}
struct NameView: View {
// Should this be an `@ObservedObject` or `@StateObject`?
@ObservedObject var viewModel: ViewModel
init(_ viewModel: ViewModel) {
self.viewModel = viewModel
}
var body: some View {
Text(viewModel.name)
}
}
Существует одно важное различие между @stateobject и @observedObject, которое является владением - которое представление создало объект, и какое представление просто смотрит. < /p>
< EM> Правило таково: в каком бы то ни было первое, что создает ваш объект, должен использовать @StateObject, чтобы сказать Swiftui, что это владелец данных и несет ответственность за поддержание его живыми. Все остальные представления должны использовать @observedObject, чтобы сказать Swiftui, что они хотят наблюдать за объектом для изменений, но не владеют им напрямую.
Похоже, что если представление Чтобы создать viewModel , его необходимо объявить с помощью @StateObject . Мой код очень похож, единственное отличие состоит в том, что ViewModel создается в другом месте, но View «владеет» после инициализации.
Подробнее здесь: https://stackoverflow.com/questions/710 ... y-the-view