【发布时间】:2020-04-01 09:39:29
【问题描述】:
我想为用户只能输入小写字符的 url 条目使用特定的 TextField,但我找不到任何用于此目的的 TextField 修饰符。有什么解决办法吗?
【问题讨论】:
标签: swiftui
我想为用户只能输入小写字符的 url 条目使用特定的 TextField,但我找不到任何用于此目的的 TextField 修饰符。有什么解决办法吗?
【问题讨论】:
标签: swiftui
TextField 有一个.autocapitalization() 方法。
不用自定义绑定也可以这样使用:
TextField("URL", text: $url)
.keyboardType(.URL)
.autocapitalization(.none)
对于 iOS 15 SwiftUI 有一个新的.textInputAutocapitalization() 方法:
.textInputAutocapitalization(.never)
这意味着用户输入的任何文本都是.lowercased()
【讨论】:
.keyboardType 和.autocapitalization 之间有一个.foregroundColor(),但由于某种原因它不起作用。此外,如果您不幸地复制和粘贴,这也不起作用。
您可以创建一个自定义绑定并通过它将您的状态 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)
}
}
}
【讨论】:
XCODE 13
SwiftUI - IOS 15.0
发件人:
.autocapitalization(.none)
收件人:
.textInputAutocapitalization(.never)
例子:
TextField("Enter URL", text: $url)
.keyboardType(.URL)
.textInputAutocapitalization(.never)
【讨论】:
如果您只想在用户按下回车键后以小写字符串“结束”,您可以这样做:
@State var txt: String = ""
var body: some View {
TextField("", text: $txt, onEditingChanged: { _ in
self.txt = self.txt.lowercased()
})
}
【讨论】:
一种更复杂但更灵活的方式,是这样的:
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())
【讨论】: