在SwiftUI中,我有一个文本字段,用户可以在其中输入信用卡号:
@EnvironmentObject var userModData:UserModData
var body: some View {
...
HStack {
Text("Card number")
.frame(width: 100, height: nil, alignment: .leading)
TextField("Enter card number", text: $userModData.cnumber).keyboardType(.numberPad)
}
每次用户输入四位数时,我想添加一个空格,例如。 G。它应该看起来像:1234 5678 1234 5678
在可观察对象类中,我尝试编写
class UserModData:ObservableObject {
@Published var cnumber:String = " " {
didSet{
self.cnumber = self.NumberFormatter()
}
}
func NumberFormatter() -> String {
var newValue = self.cnumber
if newValue.count == 4 {
newValue = newValue + " "
}
return newValue
}
}
这会导致运行时错误EXC_BAD_ACCESS,因为在将字符串连接到函数中时,一遍又一遍地调用了didSet代码(至少我猜这是原因,因为它导致溢出?!)。
有人能解决这个问题吗?老实说,我对SwiftUI还是很陌生,我认为该解决方案比我想象的要容易。
谢谢!
答案 0 :(得分:2)
SwiftUI无法完成您要达到的目标,因为添加空格后无法用光标跳到Textfield的末尾。 (SwiftUI仍只是开始。) 对于这一部分,请看一下this question。
您要查找的正确代码以下面的代码开头,并且必须实现上面链接的答案:
class UserModData:ObservableObject {
@Published var cnumber: String = ""
}
struct ContentView : View {
@ObservedObject var userModData = UserModData()
var body: some View {
let cnumber = Binding<String> (
get: {
(self.userModData.cnumber )},
set: { newValue in
if newValue.count % 4 == 0 {
self.userModData.cnumber = newValue + " "
} else {
self.userModData.cnumber = newValue
}
})
return HStack {
Text("Card number")
.frame(width: 100, height: nil, alignment: .leading)
TextField("Enter card number", text: cnumber).keyboardType(.numberPad)
}
}
}