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

Swift中如何根据条件调整UITextField交互:解决日期选择器与toast异常问题

问题根源分析

两个问题都是现有实现逻辑错误导致的:

  1. 首次点击toDateTextField无响应:你在viewDidLoad中将toDateTextField.isEnabled设为false,被禁用的控件完全不会响应交互事件,自然不会触发代理回调也不会弹出提示。
  2. 点击fromDateTextField也弹出toast:你在textFieldDidBeginEditing代理中没有区分当前触发的是哪个输入框,只要fromDateTextField为空,不管点哪个输入框都会弹出toast。

解决方案

替换原有的isEnabled控制逻辑,改用UITextFieldDelegate的textField(_:shouldBeginEditing:)方法控制编辑权限,这个方法会在输入框即将进入编辑状态前触发,返回false就不会弹出输入视图(日期选择器),刚好匹配你的需求。

具体修改步骤:

  • 删除viewDidLoad中的toDateTextField.isEnabled = false代码
  • 删除textFieldDidBeginEditing的全部实现
  • 删除doneButtonPressed中的toDateTextField.isEnabled = true代码
  • 新增shouldBeginEditing代理实现,如下:
func textField(_ textField: UITextField, shouldBeginEditing editing: Bool) -> Bool {
    // 点击的是结束日期输入框
    if textField == toDateTextField {
        // 检查开始日期是否为空
        guard !(fromDateTextField.text?.isEmpty ?? true) else {
            view.makeToast("Please select from date")
            // 返回false,不进入编辑,不会弹出日期选择器
            return false
        }
        return true
    }
    // 点击的是开始日期输入框,直接允许进入编辑
    return true
}

修改后完整代码参考:

override func viewDidLoad() {
    super.viewDidLoad()
    // 两个输入框都要设置delegate为当前控制器,不要漏
    fromDateTextField.delegate = self
    toDateTextField.delegate = self
    // 原有设置日期选择器为inputView的代码保持不变
}

// 控制输入框是否允许进入编辑
func textField(_ textField: UITextField, shouldBeginEditing editing: Bool) -> Bool {
    if textField == toDateTextField {
        guard !(fromDateTextField.text?.isEmpty ?? true) else {
            view.makeToast("Please select from date")
            return false
        }
        return true
    }
    return true
}

// 日期选择器完成按钮点击逻辑
@objc func doneButtonPressed(_ sender: UIBarButtonItem) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let arr = [fromDateTextField, toDateTextField]
    guard let current = arr[sender.tag],
          let datePicker = current.inputView as? UIDatePicker else {
        return
    }
    current.text = dateFormatter.string(from: datePicker.date)
    current.resignFirstResponder()
}

内容的提问来源于stack exchange,提问作者anySwift

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:48:01