SwiftUI View Property willSet & didSet property observers not working

余生长醉 提交于 2020-03-21 19:06:01

问题


I have a SwiftUI (Beta 5) view with an attached ViewModel. I want to navigate to it via a navigationLink and pass in a simple parameter (called FSAC in this case)

I navigate using

NavigationLink("Next", destination: MyTestView(FSAC: "testFsac"))

The view has an FSAC Property with willSet and didSet property observer

struct MyTestView: View {
    @ObservedObject var vm = MyTestViewModel()

var FSAC: String {
    willSet {
        print("will set fsac")
    }
    didSet {
        print("did set fsac")
        vm.FSAC = FSAC
    }
}

var body: some View {
    VStack {
        Text("FSAC: \(FSAC)")
        Text("VM FSAC: \(vm.FSAC)")
    }
}

}

The print statements are never called. The first text box displays the parameter correctly; the second is blank.

How can I get the Property Observers to fire?

More generally, is there a "correct" way to use a navigationLink to pass parameters to a View that has a ViewModel?


回答1:


Property observers on basic vars technically work in SwiftUI. If you do something like var view = MyTestView(...) and then view.FSAC = "updated" the the observers will fire (I've verified this).

However, typically with SwiftUI you construct the View (which is a struct not a class) within body during each layout pass. In your case var body: some View { MyTestView(FSAC: "FSAC Value") }.

Property observers do not fire during init, and therefore they aren't usually useful in SwiftUI Views.

If you would like to update some sort of State during init, take a look at this answer.




回答2:


Thanks to arsenius for an explanation as to why the Property Observers did not fire in this instance.

As a fix, I removed the property in the view, and replaced it with an init function with a signature which included the required data to be passed from the NavigationLink call. Within the init, I called a function on the ViewModel directly.

struct MyTestView: View {

    @ObservedObject var vm = MyTestViewModel()

    init(FSAC: String) {
        if(FSAC != "") {
            vm.SetFsac(FSAC: FSAC)
        }
    }
...



回答3:


Managed to solve my problem too, I had a toggle that was in the View and didn't get triggered. Moved the binding variable for toggle to observed object that is my (view) model and exposed published property from there. Using Andy's and arsenius' info.



来源:https://stackoverflow.com/questions/57485024/swiftui-view-property-willset-didset-property-observers-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!