You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:12:10