Swift中如何根据条件调整UITextField交互:解决日期选择器与toast异常问题
问题根源分析
两个问题都是现有实现逻辑错误导致的:
- 首次点击
toDateTextField无响应:你在viewDidLoad中将toDateTextField.isEnabled设为false,被禁用的控件完全不会响应交互事件,自然不会触发代理回调也不会弹出提示。 - 点击
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
相关产品推荐
相关产品推荐

