微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI 清除文本字段 FirstResponder

如何解决SwiftUI 清除文本字段 FirstResponder

我希望使用一个独立的按钮来清除我的 FirstResponder TextField,该按钮将保存字段数据并清除输入内容,以便我们可以再次写入。我的代码基于以下工作:

马泰奥·帕西尼 -> https://stackoverflow.com/a/56508132/15763454

Clear 变量在变为 True 时应该清除字段,当我单击按钮时它会起作用,但我必须另外在文本字段中输入一个字符才能清除。这是合乎逻辑的,因为“textFieldDidChangeSelection”函数仅在文本字段更改时运行

如何确保一旦我的 Clear 变量更改为 True,文本字段就会自动删除

struct ContentView : View {
    
    @State var text: String = ""
    @State var Clear = false
    
    var body: some View {
        
        HStack{
            
            Spacer()
            
            Button(action: set,label: {
                Text("Clic")
            })
            
            
            Spacer()
            CustomTextField(text: $text,clear: $Clear,isFirstResponder: true)
                .frame(width: 300,height: 50)
                .background(Color.red)
        }
        
    }
    
    func set(){
        self.Clear=true
    }
    
}

struct CustomTextField: UIViewRepresentable {
    
    
    class Coordinator: NSObject,UITextFieldDelegate {
        
        @Binding var text: String
        @Binding var clear: Bool
        var didBecomeFirstResponder = false
        
        init(text: Binding<String>,clear: Binding<Bool>) {
            _text = text
            _clear = clear
            
        }
        
        func textFieldDidChangeSelection(_ textField: UITextField) {
            text = textField.text ?? ""
            if clear == true{
                textField.text?.removeAll()
                clear = false
            }
        }
        
    }
    
    
    @Binding var text: String
    @Binding var clear: Bool
    var isFirstResponder = false
    
    func makeUIView(context: UIViewRepresentableContext<CustomTextField>) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.delegate = context.coordinator
        return textField
    }
    
    func makeCoordinator() -> CustomTextField.Coordinator {
        return Coordinator(text: $text,clear: $clear)
    }
    
    func updateUIView(_ uiView: UITextField,context: UIViewRepresentableContext<CustomTextField>) {
        uiView.text = text
        if isFirstResponder && !context.coordinator.didBecomeFirstResponder  {
            uiView.becomeFirstResponder()
            context.coordinator.didBecomeFirstResponder = true
        }
    }
}

解决方法

直接替换

func set() {
    self.Clear=true
}

func set() {
    self.text = ""
}

这会立即清除文本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。