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

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

【问题讨论】:

    标签: swiftui


    【解决方案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
        猜你喜欢
        • 2013-03-31
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多