繁体   English   中英

为什么 didSet 在 SwiftUI 中的 TextField 绑定上调用了两次?

[英]Why is didSet called twice on the TextField binding in SwiftUI?

我有一个非常基本的视图,它只显示一个TextField

看法

struct ContentView: View {

    @StateObject var viewModel = ViewModel()
    
    var body: some View {
        TextField("Enter a string...", text: $viewModel.string)
    }
    
}

TextField的文本绑定到视图 model 上的string属性:

视图模型

class ViewModel: ObservableObject {
    
    @Published var string: String = "" {
        didSet {
            print("didSet string:", string)
        }
    }
    
}

我添加了一个didSet属性观察器以在字符串更改时执行自定义操作。 对于这个简单的例子,我只在控制台上打印了一个字符串。

观察

当我运行此代码并在文本字段中输入字符串“123”时,这是我得到的 output:

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
            })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM