ios - SwiftUI / 在两个模型之间组合传递数据
问题描述
我对如何在两个模型之间传递数据有疑问。
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 状态从单元传递到主模型,并在那里做出反应。例如发送请求。
解决方案
您需要isOn
在@Binding
.SettingsCell
@State
只能用于在View
自身内部初始化的属性,并且必须始终为private
. 如果要传入一个值,该值应View
在其更改时更新,但该值是在 之外创建的View
,则需要使用Binding
.
另一个需要注意的非常重要的事情是@ObservedObject
s 必须始终注入到View
s 中,您不能在视图本身内初始化它们。这是因为每当@ObservedObject
更新 an 时,它都会更新视图本身,因此,如果您在视图中初始化对象,则每当对象更新视图时,视图都会创建一个新视图,@ObservedObject
因此您的更改不会从视图持久化到该模型。
如果您的目标是 iOS 14 并想在视图中创建模型,则可以使用@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)
}
}
}
推荐阅读
- indexing - Solr/Lucene 文档中的部分更新
- r - 新列返回分组数据中的最大值
- python - 如何在包含美元符号的 Django 视图中捕获完整的 url?
- typescript - Primeng 下拉菜单在 table-angular 8 中不起作用
- c++ - DirectX 11 D3D11_BLEND_DESC
- json - KSQL - 将 XML 转换为 JSON/AVRO
- c# - C# 动态字典 - 从动态对象中选择随机值
- r - 在 R 中使用 TensorFlow 求解方程
- python - 使用正则表达式将引号添加到分隔列表
- javascript - 如何检查数组是否不存在到一个 - vuejs