如何使 TextField 退出编辑模式

How to make TextField exit its editing mode

我试图将一个 isEditing 变量绑定到我的 UIViewRepresentable 下,它由我的 SwiftUI 视图中的关闭按钮控制。

UIViewRepresentable 下,我创建了一个 UITextfield,我想在这里完成的是点击触发 isEditing 变量的关闭按钮并重置 UITextfield 使其离开编辑模式。我试图在 updateUIView

下检测到这个变化
struct SearchBarViewController: UIViewRepresentable {
    let searchEngine = SearchEngine()
    
    let textField = LeftPaddedTextField(frame: .zero)
    
    @Binding var text: String
    @Binding var searchArray:[String]
    @Binding var isEditing: Bool
    
    func makeUIView(context: UIViewRepresentableContext<SearchBarViewController>) -> UITextField {
        textField.delegate = context.coordinator
        textField.textColor = UIColor.gray
        
        textField.placeholder = "Where are you going?"
        textField.layer.cornerRadius = 20
        //textField.layer.borderWidth = 1.5
        textField.layer.borderColor = UIColor.tertiaryLabel.cgColor
        textField.backgroundColor = UIColor.systemGray6
        textField.borderStyle = .none
        
        textField.addTarget(context.coordinator, action: #selector(context.coordinator.textFieldDidChange), for: .editingChanged)
        
        textField.clearButtonMode = .whileEditing
        
        searchEngine.delegate = context.coordinator
        return textField
    }

    func updateUIView(_ uiViewController: UITextField, context: UIViewRepresentableContext<SearchBarViewController>) {
        if isEditing {
            return
        }
        print("update is called")
        if !isEditing {
            //textField.resignFirstResponder()
            textField.endEditing(true)
        }
    }
    
    func makeCoordinator() -> SearchBarViewController.Coordinator {
        Coordinator(self)
    }
    
    final class Coordinator: NSObject, UITextFieldDelegate, SearchEngineDelegate {
        var control: SearchBarViewController
        
        init(_ control: SearchBarViewController) {
            self.control = control
        }
        
        func resultsUpdated(searchEngine: SearchEngine) {
            self.control.searchArray = []
            if !searchEngine.items.isEmpty {
                for i in searchEngine.items {
                    if let description = i.descriptionText {
                        self.control.searchArray.append(description)
                    }
                }
            }
            print()
        }
        
        func resolvedResult(result: SearchResult) {
            print()
        }
        
        func searchErrorHappened(searchError: SearchError) {
            print("Error during search: \(searchError)")
        }
        
        func textFieldDidBeginEditing(_ textField: UITextField) {
            self.control.isEditing = true
        }
        
        func textFieldShouldClear(_ textField: UITextField) -> Bool {
            return true
        }
        
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            self.control.textField.resignFirstResponder()
            self.control.isEditing = false
            return true
        }
    
        // Update model.text when textField.text is changed
        @objc func textFieldDidChange() {
            if let text = self.control.textField.text {
                self.control.text = text
            }
            if self.control.textField.text != "" {
                if let text = control.textField.text {
                    control.searchEngine.query = text
                }
            } else {
                self.control.searchArray = []
            }
        }
        
    }
}

这里是外部视图的代码:

struct SearchBarView: View {
    @State var isEditing = false
    ...
    var body: some View {
         Button(action: {
             self.isEditing = false
             self.text = ""
         }) {
             Text("Return")
         }
                    
         SearchBarViewController(text: $text, searchArray: $searchArray, isEditing: $isEditing)
    }
}

但问题是它不起作用。单击关闭按钮后,UITextField 没有退出其编辑模式,我仍然可以输入。所以想请问有没有办法实现。

提前感谢您的帮助。

尝试使用传入的文本字段实例

func updateUIView(_ uiTextField: UITextField, context: UIViewRepresentableContext<SearchBarViewController>) {
    if isEditing {
        return
    }
    print("update is called")
    if !isEditing {
        uiTextField.resignFirstResponder()      // << here !!
        // uiTextField.endEditing(true)
    }
}