SwiftUI TextField 强制小写

Posted

技术标签:

【中文标题】SwiftUI TextField 强制小写【英文标题】:SwiftUI TextField force lowercase 【发布时间】:2020-04-01 09:39:29 【问题描述】:

我想为用户只能输入小写字符的 url 条目使用特定的 TextField,但我找不到任何用于此目的的 TextField 修饰符。有什么解决办法吗?

【问题讨论】:

【参考方案1】:

TextField 有一个.autocapitalization() 方法。

不用自定义绑定也可以这样使用:

TextField("URL", text: $url)
                    .keyboardType(.URL)
                    .autocapitalization(.none)

对于 ios 15 SwiftUI 有一个新的.textInputAutocapitalization() 方法:

.textInputAutocapitalization(.never)

这意味着用户输入的任何文本都是.lowercased()

【讨论】:

注意:这仅在您出于某种原因将它们按此顺序排列时才有效。我在.keyboardType.autocapitalization 之间有一个.foregroundColor(),但由于某种原因它不起作用。此外,如果您不幸地复制和粘贴,这也不起作用。【参考方案2】:

您可以创建一个自定义绑定并通过它将您的状态 URL 变量设置为输入的小写版本:

struct ContentView: View 
    @State var url: String = ""

    var body: some View 
        let binding = Binding<String>(get: 
            self.url
        , set: 
            self.url = $0.lowercased()
        )

        return VStack 
            TextField("Enter URL", text: binding)
        

    

【讨论】:

这很好用。也可以写成:TextField("Enter URL", text: Binding(get: self.url , set: string in self.url = string.lowercased() ))【参考方案3】:

XCODE 13

SwiftUI - IOS 15.0

发件人:.autocapitalization(.none)

收件人:.textInputAutocapitalization(.never)

例子:

TextField("Enter URL", text: $url)
    .keyboardType(.URL)
    .textInputAutocapitalization(.never)

【讨论】:

【参考方案4】:

如果您只想在用户按下回车键后以小写字符串“结束”,您可以这样做:

@State var txt: String = ""

var body: some View 
        TextField("", text: $txt, onEditingChanged:  _ in
            self.txt = self.txt.lowercased()
        )

【讨论】:

【参考方案5】:

一种更复杂但更灵活的方式,是这样的:

class LowerCaseStringFormatter: Formatter 

override func string(for obj: Any?) -> String? 
    guard let str = obj as? NSString else  return nil 
    return str.lowercased as String


override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool 
    obj?.pointee = string.lowercased() as NSString
    return true


override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool 
    return true

然后这样称呼它:

 TextField("type something...", value: $txt, formatter: LowerCaseStringFormatter())

【讨论】:

不错的解决方案,但似乎 XCode 11.4 TextField 不推荐使用格式化程序,它会抛出异常“调用中的额外参数'格式化程序'” 不确定为什么会出现该错误。它适用于 Xcode 11.4、iPhone 和 iPad ios 13.4 以及 macos catalina 10.15.4

以上是关于SwiftUI TextField 强制小写的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 UITextField 仅支持小写字符?

SwiftUI:TextField 内的填充

使用 SwiftUI 中活动 TextField 中的值更新非活动 TextField

UIPickerView 作为 SwiftUI 中 TextField() 的输入

如何防止 TextField 在 SwiftUI 列表中消失?

如何检测何时点击 TextField? (MacOS 上的 SwiftUI)