我有一个非常基本的视图,只显示一个TextField
:
视图
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
TextField("Enter a string...", text: $viewModel.string)
}
}
TextField
的文本与视图模型上的 string
属性绑定:
视图模型
class ViewModel: ObservableObject {
@Published var string: String = "" {
didSet {
print("didSet string:", string)
}
}
}
我添加了一个didSet
属性观察者,在字符串更改时执行自定义操作。对于这个简单的示例,我只在控制台上打印一个字符串。
观察结果
当我运行这段代码并在文本字段中输入字符串“123”时,这是我得到的输出:
didSet string: 1
didSet string: 1
didSet string: 12
didSet string: 12
didSet string: 123
didSet string: 123
问题:
为什么?
每次我键入一个字符,didSet
闭包会被调用两次?(我期望它每个字符只调用一次。)
这段代码有问题吗?还是这是预期的行为?
$string.sink {...}
监听更改? - Mischa