我有一个非常基本的视图,它只显示TextField
:
查看
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
TextField("Enter a string...", text: $viewModel.string)
}
}
TextField
的文本绑定到视图模型上的string
属性:
ViewModel
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
闭包两次?(我希望每个字符调用一次。)
代码有什么问题吗?或者这是预期的行为吗?
我在Xcode 14.2 RC和iOS 16.2 RC上看到了这个问题,但奇怪的是,修复它的是添加了.textFieldStyle(.plain)
或.textFieldStyle(.roundedBorder)
。
我真的不知道为什么没有textFieldStyle会影响这一点,但当我没有设置textFieldStyle时,绑定调用set:{}两次,一旦我添加了其中一个,它就会正常工作,一次只调用set:{}一次。
我希望这能帮助到别人!
let binding = Binding<String>(get: {
textvariable
}, set: {
viewModel.setText(query: $0) //add event inside setText
// do whatever you want here
})