簡體   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