【发布时间】:2020-03-16 17:41:47
【问题描述】:
我正在尝试使用模式或掩码格式化 SwiftUI TextField 中的数据。 (为了清楚起见 - 不是 UITextField)。一个例子是美国的电话号码。所以用户 可以键入 1115551212,视图中的结果是 111-555-1212。我将在此使用 numberPad 情况,但是对于将来,使用全键盘,如果用户键入一个非数字,我希望能够用一些东西来替换它,比如 0。所以输入 111abc1212 将导致 111-000-1212。即使下面的代码将字符串转换为数字,理想情况下,我希望掩码对字符串而不是数字进行操作 - 提供格式化部件号等的灵活性。
我已经能够使用通过按钮操作的 func 来做到这一点,但当然 我希望它是自动的。我对 SwiftUI 修饰符完全不成功 做同样的事情。并且使用内置的 .textContentType(.telephoneNumber) 确实 在我的测试中绝对没有。
我希望有一些像 .onExitCommand 这样的修饰符可以在 焦点离开 TextField 但我没有看到解决方案。
此代码适用于按钮(我稍后将添加规则以过滤数字时 数字是预期的):
struct ContentView: View {
@State private var phoneNumber = ""
@State private var digitArray = [1]
var body: some View {
VStack {
Group {//group one
Text("Phone Number with Format").font(.title)
.padding(.top, 40)
TextField("enter phone number", text: $phoneNumber)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
.keyboardType(.numberPad)
}//Group one
Group {//group two
Button(action: {self.populateTextFieldWithPhoneFormat(phoneString: self.phoneNumber)}) {
Text("Convert to Phone Format")
}
}//group two
Spacer()
}//VStack
}
func populateTextFieldWithPhoneFormat(phoneString: String) {
var digitArray = [Int]()
let padded = phoneNumber.padding(toLength: 10, withPad: "0", startingAt: 0)
let paddedArray = padded.map {String($0)}
for char in paddedArray {
digitArray.append(Int(char) ?? 0)
}
phoneNumber = format(digits: digitArray)
}//populate
func format(digits: [Int]) -> String {
var phone = digits.map(String.init)
.joined()
if digits.count > 3 {
phone.insert("-", at: phone.index(
phone.startIndex,
offsetBy: 3)
)
}
if digits.count > 7 {
phone.insert("-", at: phone.index(
phone.startIndex,
offsetBy: 7)
)
}
return phone
}
}
我也尝试制作自己的 ViewModifier,但没有成功。
任何指导将不胜感激。
Xcode 版本 11.2.1 (11B500)
【问题讨论】:
-
你可以像here这样使用Binding