В моем приложении есть одноэлементный экземпляр AppSetting
, который используется во всех видах и моделях. AppSetting имеет переменную, userName
.
class AppSetting: ObservableObject {
static let shared = AppSetting()
private init() { }
@Published var userName: String = ""
}
ParentView печатает userName
, когда он не пуст. Сначала он пуст.
struct ParentView: View {
@State var isChildViewPresented = false
@ObservedObject var appSetting = AppSetting.shared
var body: some View {
ZStack {
Color.white.edgesIgnoringSafeArea(.all)
VStack {
Button(action: { self.isChildViewPresented = true }) {
Text("Show ChildView")
}
if !appSetting.userName.isEmpty { // <--- HERE!!!
Text("\(appSetting.userName)")
}
}
if isChildViewPresented {
ChildView(isPresented: $isChildViewPresented)
}
}
}
}
Когда пользователь нажимает кнопку, будет установлен userName
.
struct ChildView: View {
@Binding var isPresented: Bool
@ObservedObject var childModel = ChildModel()
var body: some View {
ZStack {
Color.white.edgesIgnoringSafeArea(.all)
VStack {
Button(action: { self.childModel.setUserName() }) { // <--- TAP BUTTON HERE!!!
Text("setUserName")
}
Button(action: { self.isPresented = false }) {
Text("Close")
}
}
}
}
}
class ChildModel: ObservableObject {
init() { print("init") }
deinit { print("deinit") }
func setUserName() {
AppSetting.shared.userName = "StackOverflow" // <--- SET userName HERE!!!
}
}
Проблема в том, что, если установлено значение userName
, экземпляр ChildModel
признан недействительным. Я думаю, что когда ParentView добавляет Text("\(appSetting.userName)")
, он меняет свою иерархию представления, а затем заставляет SwiftUI удалить старый экземпляр ChildModel и создать новый. К сожалению, это дает мне кучу ошибок. В моем приложении экземпляр ChildModel должен быть активным до тех пор, пока пользователь явно не закроет ChildView.
Как мне сделать экземпляр ChildModel живым?
Заранее спасибо.