TextField swiftUI 仅接受时间

问题描述 投票:0回答:1

我找不到以下问题的太多示例,所以在这里我再次请求您的帮助,在我的应用程序上,我希望我的用户只能在文本字段上输入时间,例如 22:30,文本字段有仅接受时间而不接受任何类型的字母或其他,而且我需要确保用户插入的数字不超过 4 个数字,是否有任何可能的解决方案以及如何做到这一点?

TextField("Test2", text: $test)
                       .textFieldStyle(.roundedBorder)
                       .keyboardType(.numberPad)

我不知道要寻找什么来解决这个问题,某种格式化程序,但我只能找到数字格式化程序,注意与时间相关

谢谢

swift swiftui time textfield formatter
1个回答
4
投票
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)
            }
© www.soinside.com 2019 - 2024. All rights reserved.