UITextField焦点判断:设置isTouchInside为false是否可行及数组添加异常问题
嘿,我来帮你捋捋这个问题~
先说结论:用isTouchInside来判断焦点并手动设为false完全不可行
isTouchInside这个属性本质是用来判断当前触摸事件是否发生在控件的 bounds 范围内,和文本框是否获得焦点(成为第一响应者)根本不是一回事。而且这个属性是系统自动管理的,你手动设置isTouchInside = false后,系统会在触摸事件流程里覆盖掉你的设置,完全起不到你想要的效果。
解决你的核心需求:精准在文本框选中时添加对应值
你现在遇到的问题(点txt2时txt1的值也被添加),大概率是触发添加操作的时机不对,或者没有区分清楚是哪个文本框触发的事件。给你推荐几个靠谱的替代方案:
方案1:用UITextFieldDelegate监听焦点变化(最推荐)
UITextField的代理方法能精准捕获“开始编辑(获得焦点)”和“结束编辑(失去焦点)”的时机,结合文本框的标识(tag或自定义属性),就能只给当前选中的文本框添加对应值。
举个Swift代码例子:
// 先定义数组和文本框 var valueArray = [String]() @IBOutlet weak var txt1: UITextField! @IBOutlet weak var txt2: UITextField! override func viewDidLoad() { super.viewDidLoad() // 给文本框设置代理 txt1.delegate = self txt2.delegate = self // 设置tag区分不同文本框(也可以用自定义属性) txt1.tag = 1 txt2.tag = 2 } // 实现UITextFieldDelegate的方法 extension YourViewController: UITextFieldDelegate { // 文本框开始编辑(获得焦点)时触发 func textFieldDidBeginEditing(_ textField: UITextField) { // 可选:避免重复点击同一文本框重复添加值 let alreadyAdded = valueArray.contains { value in value.hasPrefix(textField.tag == 1 ? "txt1_" : "txt2_") } guard !alreadyAdded else { return } // 根据文本框标识添加对应值 switch textField.tag { case 1: valueArray.append(contentsOf: ["txt1_val1", "txt1_val2", "txt1_val3"]) case 2: valueArray.append(contentsOf: ["txt2_val1", "txt2_val2", "txt2_val3"]) default: break } } }
方案2:给文本框添加触摸事件(适合不需要编辑功能的场景)
如果你的文本框只是用来触发选择,不需要编辑内容,可以直接给文本框添加UIControl.Event.touchUpInside事件,点击时添加对应值:
override func viewDidLoad() { super.viewDidLoad() txt1.addTarget(self, action: #selector(textFieldTapped(_:)), for: .touchUpInside) txt2.addTarget(self, action: #selector(textFieldTapped(_:)), for: .touchUpInside) } @objc func textFieldTapped(_ sender: UITextField) { // 同样用tag区分,添加对应值 switch sender.tag { case 1: valueArray.append(contentsOf: ["txt1_val1", "txt1_val2", "txt1_val3"]) case 2: valueArray.append(contentsOf: ["txt2_val1", "txt2_val2", "txt2_val3"]) default: break } // 如果需要让文本框成为第一响应者,再加这句 sender.becomeFirstResponder() }
关键注意点
- 一定要区分触发事件的文本框:用tag、自定义属性或者直接判断引用,避免混淆不同文本框的操作
- 如果不想重复添加同一文本框的值,可以用一个
Set<Int>记录已经处理过的文本框tag,在触发前先判断
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

