我找不到以下问题的太多示例,所以在这里我再次请求您的帮助,在我的应用程序上,我希望我的用户只能在文本字段上输入时间,例如 22:30,文本字段有仅接受时间而不接受任何类型的字母或其他,而且我需要确保用户插入的数字不超过 4 个数字,是否有任何可能的解决方案以及如何做到这一点?
TextField("Test2", text: $test)
.textFieldStyle(.roundedBorder)
.keyboardType(.numberPad)
我不知道要寻找什么来解决这个问题,某种格式化程序,但我只能找到数字格式化程序,注意与时间相关
谢谢
struct TimeTextField: View {
@Binding var time: String
var body: some View {
TextField("Time", text: $time)
.textFieldStyle(.roundedBorder)
.textContentType(.none)
.keyboardType(.numberPad)
.onChange(of: time) { oldValue,newValue in
time = formatTimeInput(newValue)
}
}
private func formatTimeInput(_ input: String) -> String {
let allowedCharacterSet = CharacterSet(charactersIn: "0123456789")
// Remove non-numeric characters
let numericString = input.components(separatedBy: allowedCharacterSet.inverted).joined()
// Limit the input to 4 digits
let limitedString = String(numericString.prefix(4))
// Insert colons at appropriate positions (e.g., 2230 -> 22:30)
let formattedString: String
if limitedString.count > 2 {
let index = limitedString.index(limitedString.startIndex, offsetBy: 2)
let hour = limitedString[..<index]
let minute = limitedString[index...]
formattedString = "\(hour):\(minute)"
} else {
formattedString = limitedString
}
return formattedString
}
}
要将 TextField 中的用户输入限制为特定格式,例如仅允许输入最多 4 位数字的时间,您可以利用 TextField 的 textContentType 属性并使用自定义格式化程序验证输入。
对于 iOS 17 onChange 执行调用已弃用*
.onReceive(NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification)) { _ in
time = formatTimeInput(time)
}