[英]SwiftUI / Combine Pass data between two models
我對如何在兩個模型之間傳遞數據有疑問。
struct SettingsCell: View {
@State var isOn: Bool
var body: some View {
Toggle(name, isOn: $isOn)
}
}
class SettingsModel: ObservableObject {
@Published var someValue: Bool = false
}
struct SettingsView: View {
@ObservedObject var model = SettingsModel()
var body: some View {
List {
SettingsCell(isOn: model.someValue)
}
}
}
所以我想將 isOn state 從單元傳遞到主 model,然后在那里做出反應。 例如發送請求。
您需要在SettingsCell
isOn
聲明為@Binding
。
@State
只能用於在View
內部初始化的屬性,並且必須始終是private
。 如果您想傳入一個值,該值應在View
更改時更新,但該值是在View
外部創建的,則需要使用Binding
。
另一個需要注意的非常重要的事情是@ObservedObject
必須始終注入到View
中,您不能在視圖本身內初始化它們。 這是因為每當更新@ObservedObject
時,它都會更新視圖本身,因此如果您在視圖內初始化 object,每當 object 更新視圖時,視圖將創建一個新的@ObservedObject
,因此您的更改不會被持久化從model來看。
如果您的目標是 iOS 14 並希望在視圖內創建 model,則可以改用@StateObject
。
struct SettingsCell: View {
@Binding private var isOn: Bool
init(isOn: Binding<Bool>) {
self._isOn = isOn
}
var body: some View {
Toggle(name, isOn: $isOn)
}
}
class SettingsModel: ObservableObject {
@Published var someValue: Bool = false
}
struct SettingsView: View {
@ObservedObject private var model: SettingsModel
init(model: SettingsModel) {
self.model = model
}
var body: some View {
List {
SettingsCell(isOn: $model.someValue)
}
}
}
在數據由父視圖“擁有”的情況下使用Binding
- 即父視圖擁有事實來源 - 並且需要子視圖更新它:
struct SettingsCell: View {
@Binding var isOn: Bool // change to Binding
var body: some View {
Toggle(name, isOn: $isOn)
}
}
struct SettingsView: View {
// unrelated, but better to use StateObject
@StateObject var model = SettingsModel()
var body: some View {
List {
// pass the binding by prefixing with $
SettingsCell(isOn: $model.someValue)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.