我正在使用 Xcode 13 和 SwiftUI(最新版本)。
我有一个简单的
TextField
,里面有一个View
。
TextField("enter barcode", value: $scannedBarcode, shouldChangeText : ?)
我不知道如何使用
shouldChangeText
的 TextField
属性。
我需要一个如何连接此功能的示例。
我是 SwiftUI 的新手,找不到示例,而且开发人员文档也非常缺乏。
显然它看起来可能是这样的:
shouldChangeText(in: \<UITextRange\>, replacementText: \<String\>)
我对 Xcode 很陌生(几周),需要一个可靠的示例来说明如何使用它从文本字段中过滤掉所有非整数(无小数点或字母字符)
在下面的帮助下我发现了这个:
TextField("enter barcode", text: Binding(get: {scannedBarcode}, set: { scannedBarcode = String($0).replacingOccurrences( of:"[^0-9]", with: "", options: .regularExpression)}))
这非常适合过滤掉进入 ScanBarcode 变量的非数字。我怎样才能从一开始就防止它们撞到屏幕?
这在
SwiftUI
中非常简单,你只需要使用.onChange
。将其添加到您的View
中的任何位置:
.onChange(of: scannedBarcode) { newValue in
//do anything with newValue
}
它将为您提供
TextField
中内容的准确值。
对于
UIKit
来说,以下函数是 UITextFieldDelegate
的一部分:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
}
UIKit
与 SwiftUI
:
struct UTextField: UIViewRepresentable {
let placeHolder: String
@Binding var text: String?
init(_ placeHolder: String, text: Binding<String?>) {
self.placeHolder = placeHolder
self._text = text
}
func makeUIView(context: Context) -> UITextField {
let textField = UITextField()
textField.delegate = context.coordinator
textField.placeholder = placeHolder
return textField
}
func updateUIView(_ uiView: UITextField, context: Context) {
text = uiView.text
}
func makeCoordinator() -> Coordinator {
return Coordinator()
}
class Coordinator: NSObject, UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
//do something
//whenever you don't want the text to be entered you return false
return true
}
}
}
用途:
UTextField("", text: $someText)
struct TextFieldPOC: View {
@State var text: String = ""
var body: some View {
TextField("Test Field", text: $text).fontWeight(.bold).multilineTextAlignment(.center).frame(height: 50).background(content: {
Rectangle().stroke(style: .init(lineWidth: 2))
}).padding([.leading, .trailing], 20).onChange(of: text, { (first, second) in
let oldText = first
let newText = second
let allowed = CharacterSet.decimalDigits.union(CharacterSet.whitespaces)
let entered = CharacterSet.init(charactersIn: newText)
if entered.isSubset(of: allowed) == false {
text = oldText
}})}}