我刚刚在 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)
非常感谢!
为了使您的username和password属性正确绑定到您的字段,您需要@Published在ObservableObject.
以下版本可以正常工作,并且不会遇到您提到的问题:
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)