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 强制小写的主要内容,如果未能解决你的问题,请参考以下文章
使用 SwiftUI 中活动 TextField 中的值更新非活动 TextField
UIPickerView 作为 SwiftUI 中 TextField() 的输入