ios - 嵌入式@Binding 不会更改值

标签 ios swift swiftui

关注 this cheat sheet我试图找出 SwiftUI 中的数据流。所以:

Use @Binding when your view needs to mutate a property owned by an ancestor view, or owned by an observable object that an ancestor has a reference to.


这正是我需要的,所以我的嵌入式模型是:
class SimpleModel: Identifiable, ObservableObject {
    @Published var values: [String] = []

    init(values: [String] = []) {
        self.values = values
    }
}
我的 View 有两个字段:
struct SimpleModelView: View {
    @Binding var model: SimpleModel
    @Binding var strings: [String]

    var body: some View {
        VStack {
            HStack {
                Text(self.strings[0])
                TextField("name", text: self.$strings[0])
            }
            HStack {
                Text(self.model.values[0])
                EmbeddedView(strings: self.$model.values)
            }
        }
    }
}

struct EmbeddedView: View {
    @Binding var strings: [String]

    var body: some View {
        VStack {
            TextField("name", text: self.$strings[0])
        }
    }
}
所以我希望 View 会改变 Text当输入字段发生变化时。它适用于 [String]但不适用于嵌入式 @Binding 对象:
enter image description here
为什么它的行为不同?

最佳答案

发布属性(property)

class SimpleModel: Identifiable, ObservableObject {
    @Published var values: [String] = []
model观察到的
struct SimpleModelView: View {
    @ObservedObject var model: SimpleModel
注意:这个方向 - 如果你引入了 ObservableObject那么对应的 View 应该有ObservedObject包装器来观察该可观察对象的已发布属性的变化。

关于ios - 嵌入式@Binding 不会更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63073350/

相关文章:

ios - 单击按钮时隐藏键盘

ios - WKWebView 中的 evaluateJavaScript() 仅在第一次运行

xcode - Swift项目快速使用MASShortcut框架

SwiftUI 绑定(bind)到列表元素仅更新以正确顺序输入的值

swiftui - 如何刷新指向同一 URL 的 AsyncImage

ios - UICollectionView 和在单元格上写文本

ios - 协议(protocol)和委托(delegate)之间的区别?

swift - 为什么我不能在 SwiftUI init 中为 @State var 赋值?

ios - @IBDesignable 崩溃剂

ios - 子类的类上的泛型