方案
說明備註
@state
&@binding
提供 view 內部的狀態儲存
應該是被標記為 private 的簡單值型別,僅在內部使用。
observableobject
&@observedobject
針對跨越 view 層級的狀態共享
處理更複雜的資料型別,在資料變化時觸發介面重新整理。
@environmentobject
對於 「跳躍式」 跨越多個 view 層級的狀態
更方便地使用 observableobject,以簡化**。
parent view:
struct
parentview
:view
}}
child view:
struct
childview
:view
}}
執行效果:
注意,@published
是個 internal 的。在 xcode 工程裡沒事,但在 playground 的 sources 裡寫是必須 public 的,這時可以採用下面這種手動處理的方法:
import
combine
public
class
model
:observableobject
}public
init()
}
parent view:
public
struct
parentview
:view
}public
init()
}
child view:
public
struct
childview
:view
}public
init
(model:
model
)}
這裡其實是利用 class 的「傳引用」特性來讓子訪問到父的 model 的,沒什麼特殊的。
沿用上面observableobject
的 model:
class
model
:observableobject
parent view:
public
struct
parentview
:view
}public
init()
}
child view:
public
struct
childview
:view
}public
init()
}
呼叫 parent 的 view:
parentview()
.environmentobject
(model()
)
用 environmentobject 讓所有子都訪問到父的 model,可以避免逐層手動傳遞物件。
完整原始碼實現:swiftuidatastateandbinding.playground。
王巍 (@onevcat)《swiftui 與 combine 程式設計》chapter 3:資料狀態和繫結
狀態和資料流 SwiftUI 中文文件手冊)
控制和響應應用程式模型中的資料流和更改。swiftui為使用者介面設計提供了一種宣告式方法。組成檢視層次結構時,還需要指示檢視的資料依賴性。當資料由於外部事件或使用者採取的措施而更改時,swiftui會自動更新介面的受影響部分。結果,該框架自動執行了檢視控制器傳統上完成的大部分工作。該框架提供了一些...
Swift UI專項訓練7 資料新增
上一話我們使用了自己定義的控制器之後發現tableview上的餐館沒有了,這一話我們來新增資料,新新增乙個餐館類,這個類我們不需要繼承系統的類,直接新增乙個swift檔案就好 我簡單建乙個類,分別代表餐館名字 餐館位置和餐館評分,它們都有預設值。然後我們回到餐館排行的控制器中新建乙個餐館的陣列。va...
vue 單向資料繫結 雙向資料繫結和單向資料流
用過vue開發的同學都知道,vue.js 最顯著的特點就是響應式和資料驅動,也就是將model和view進行單向繫結或者雙向繫結。我最近才深入了解到有單向繫結,自己平時用,但是不了解其中緣由 vue支援雙向資料繫結和單向資料繫結 1.插值形式 hello,you are years old expo...