SwiftUI 清除文本字段 FirstResponder

Posted

技术标签:

【中文标题】SwiftUI 清除文本字段 FirstResponder【英文标题】:SwiftUI Clear Textfield FirstResponder 【发布时间】:2021-04-25 21:46:30 【问题描述】:

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

马泰奥·帕西尼 -> https://***.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
        
    

【问题讨论】:

【参考方案1】:

只需替换

func set() 
    self.Clear=true

func set() 
    self.text = ""

这会立即清除文本。

【讨论】:

它是如此简单...非常感谢您的帮助,但使用此解决方案我在 xcode 中存在非阻塞冲突“在视图更新期间修改状态,这将导致未定义的行为。”你认为这对下一步有什么影响吗? @MaxLand 是的,你应该避免这种情况。我没有收到您发布的代码的错误,也许它在其他地方?你能显示得到错误的代码行吗? 当我点击按钮时出现问题,根据您指示的修改,文本字段被很好地删除,但在代码行级别: text = textField.text ? “”,错误:“在视图更新期间修改状态,这将导致未定义的行为。”出现。错误发生在线程 1 上。 @MaxLand 哦,干掉整个textFieldDidChangeSelection method @MaxLand 你也可以删除所有对clear 的引用

以上是关于SwiftUI 清除文本字段 FirstResponder的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Textfield - 如何在编辑模式下设置文本字段的背景颜色以清除

如何在 SwiftUI 中向 Viewmodifiers 添加闭包?

SwiftUI:文本字段被切断

SwiftUI - 文本字段返回键事件

输入 SwiftUI 后更改文本字段的焦点

文本字段点击正在关闭 SwiftUI 中的导航链接