SwiftUI Textifeld 缺少最后一个字符

Pet*_*rUI 5 swift swiftui

我刚刚在 SwiftUI 中使用 TextField() 时遇到了一个非常尴尬的问题。我想做的就是将数据从文本字段传递到一个类(用 @ObservableObject 标记)。在此类中,有一个名为 displayData() 的函数,它仅打印出文本字段传递的数据。我想说 70% 的情况下,字符串的最后一个字符会丢失。让我烦恼的是,这种情况并不总是发生。这使得很难弄清楚。

举个例子,如果我在第一个 TextField() 中输入 1234,则 print(self.username) 将返回 123。当我尝试添加第二个 4 时,它会打印出 12344。

TextField() 和 SecureField() 都有这个问题。

这就是 ContentView 中发生的事情

            TextField("Enter your username here.", text: self.$dataManager.username)
                .padding()
            SecureField("Enter your password here.", text: self.$dataManager.password)
                .padding()
            Spacer()
            Button(action: {
                self.dataManager.displayData()
            }, label: {
                Text("Send Data")
            }).padding()
            Spacer()
Run Code Online (Sandbox Code Playgroud)

并在课堂上:

var username: String = ""
var password: String = ""

func displayData(){
        print("USERNAME: \(self.username), PASSWORD: \(self.password)")
    }
Run Code Online (Sandbox Code Playgroud)

非常感谢!

jn_*_*pdx 3

为了使您的usernamepassword属性正确绑定到您的字段,您需要@PublishedObservableObject.

以下版本可以正常工作,并且不会遇到您提到的问题:

class ViewModel : ObservableObject {
    @Published var username = ""
    @Published var password = ""
    
    func displayData(){
        print("USERNAME: \(self.username), PASSWORD: \(self.password)")
    }
}

struct ContentView : View {
    @StateObject var dataManager = ViewModel()
    
    var body: some View {
        TextField("Enter your username here.", text: self.$dataManager.username)
            .padding()
        SecureField("Enter your password here.", text: self.$dataManager.password)
            .padding()
        Spacer()
        Button(action: {
            self.dataManager.displayData()
        }, label: {
            Text("Send Data")
        }).padding()
        Spacer()
    }
}
Run Code Online (Sandbox Code Playgroud)