问题描述
我希望使用一个独立的按钮来清除我的 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 = ""
}
这会立即清除文本。