为什么在SwiftUI中对TextField绑定调用didSet两次



我有一个非常基本的视图,它只显示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
})

最新更新