在我输入的TextField的字符串中添加一个空格

时间:2020-05-22 17:08:36

标签: swift xcode swiftui

在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还是很陌生,我认为该解决方案比我想象的要容易。

谢谢!

1 个答案:

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