TextField shouldChangeText 属性接线

问题描述 投票:0回答:2

我正在使用 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 textfield
2个回答
0
投票

这在

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)


0
投票
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
        }})}}
© www.soinside.com 2019 - 2024. All rights reserved.