簡體   English   中英

SwiftUI 視圖屬性 willSet 和 didSet 屬性觀察器不起作用

[英]SwiftUI View Property willSet & didSet property observers not working

我有一個帶有附加 ViewModel 的 SwiftUI(Beta 5)視圖。 我想通過 navigationLink 導航到它並傳入一個簡單的參數(在這種情況下稱為 FSAC)

我導航使用

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

該視圖有一個帶有 willSet 和 didSet 屬性觀察者的 FSAC 屬性

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)")
    }
}

}

永遠不會調用打印語句。 第一個文本框正確顯示參數; 第二個是空白。

我怎樣才能讓財產觀察員開火?

更一般地說,是否有一種“正確”的方法來使用導航鏈接將參數傳遞給具有 ViewModel 的視圖?

編輯:在 iOS 14 上,屬性觀察器的工作方式與它們在 iOS 13 中的工作方式相同。但是,我們現在有.onChange(of:perform:)作為替代。 文檔

Text(self.myString).onChange(of: self.myString) { newValue in print("myString changed to: \(newValue)") }

基本var的屬性觀察器在技術上可以在 SwiftUI 中工作。 如果您執行類似var view = MyTestView(...) ,然后view.FSAC = "updated"觀察者將觸發(我已經驗證了這一點)。

但是,通常使用 SwiftUI,您可以在每次布局傳遞期間在body構造View (它是一個結構體,而不是一個類)。 在您的情況下var body: some View { MyTestView(FSAC: "FSAC Value") }

屬性觀察器在 init 期間不會觸發,因此它們在 SwiftUI View通常沒有用。

如果您想在 init 期間更新某種狀態,請查看此答案

感謝 arsenius 解釋了為什么 Property Observers 在這種情況下沒有開火。

作為修復,我刪除了視圖中的屬性,並將其替換為帶有簽名的 init 函數,其中包含從 NavigationLink 調用傳遞的所需數據。 在 init 中,我直接在 ViewModel 上調用了一個函數。

struct MyTestView: View {

    @ObservedObject var vm = MyTestViewModel()

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

也設法解決了我的問題,我有一個在視圖中的切換並且沒有被觸發。 將用於切換的綁定變量移動到作為我的(視圖)模型的觀察對象並從那里公開發布的屬性。 使用 Andy 和 arsenius 的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM