gpt4 book ai didi

ios - 当 Bindable 属性更改时 SwiftUI 运行方法调用

转载 作者:行者123 更新时间:2023-11-29 05:21:08 29 4
gpt4 key购买 nike

我正在努力理解当 Bindable 对象发生更改时如何运行方法。这是我到目前为止的代码: enter image description here

但是,由于某种原因, fetchFoods 方法永远不会因为 searchText 更改而被调用,我似乎无法理解为什么。

最佳答案

@Harish @Asperi 你们在这里制造困惑了伙计们。 @Harish 的方法没有被调用有一个特定的原因。让我们创建一个简单的示例:

struct ContentView: View {
@State private var text = "" {
didSet {
print("Triggered!")
}
}

var body: some View {
VStack {
TextField("Type something...", text: $text)
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

如果您复制粘贴并运行这个最小可行示例,您将看到字符串“Triggered!”永远不会被打印。这是因为您通过 $ 绑定(bind)更改的不是 text 属性,而是通过 访问的绑定(bind)包装值 $ 符号。它们是两个完全不同的东西。理解这一点非常重要。

那么,为什么@Asperi 的示例有效? (我稍微简化了它以创建另一个最小可行的示例):

struct ContentView: View {
@State private var isOn = false {
didSet {
print("Triggered!")
}
}
var body: some View {
Button(
action: { self.isOn.toggle() },
label: { Text(self.isOn ? "Hide" : "Show") }
)
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

这一次,如果您复制粘贴此代码,您将看到“已触发!”将被打印。这很好,因为点击按钮您正在更改self.isOn。这次您没有使用任何 $ 符号来访问绑定(bind)包装的值。

上面的例子看似使用相同的方法,但实际上它们确实不同。再说一次,理解这种差异非常重要。那么,如何才能得到你想要的东西(即“当 Bindable 对象更改时运行方法”)?您必须依赖 ViewModel@Published 属性包装器:

class ViewModel: ObservableObject {
@Published var text = "" {
didSet {
print("Triggered!")
}
}
}

struct ContentView: View {
@ObservedObject var viewModel = ViewModel()

var body: some View {
VStack {
TextField("Type something...", text: $viewModel.text)
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

这正是为此目的:

Combine's Published property wrapper is similar in spirit [to the other property wrappers], allowing clients to subscribe to @Published properties (via the $ projection) to receive updates when the value changes.

来自https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md

关于ios - 当 Bindable 属性更改时 SwiftUI 运行方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680259/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com