Как я могу сделать экземпляр ViewModel живым в SwiftUI? - PullRequest
0 голосов
/ 23 апреля 2020

В моем приложении есть одноэлементный экземпляр 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 живым?

Заранее спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

Это возможно, когда отсоединить модель просмотра и просмотра и внедрить зависимость через конструктор

struct ChildView: View {
    @Binding var isPresented: Bool
    @ObservedObject var childModel: ChildModel  // don't initialize

    // ... other your code here

сохранить модель где-то снаружи и внедрить, когда покажут дочернее представление

if isChildViewPresented {
    // inject ref to externally stored ChildModel()
    ChildView(isPresented: $isChildViewPresented, viewModel: childModel)  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...