Swift:UITableViewCell中DatePicker长按选中时间弹出键盘的隐藏方法
解决UITableViewCell内DatePicker长按弹出键盘的问题
针对你遇到的UITableViewCell中滚轮式DatePicker长按选中区域弹出键盘的问题,可通过以下两种方案解决:
方案一:自定义DatePicker拦截长按手势
创建自定义DatePicker子类,直接拦截长按手势的触发:
import UIKit class NoLongPressDatePicker: UIDatePicker { override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { // 阻止长按手势生效 if gestureRecognizer is UILongPressGestureRecognizer { return false } return super.gestureRecognizerShouldBegin(gestureRecognizer) } }
之后在UITableViewCell的配置代码里,用这个自定义类替换系统UIDatePicker:
// 在cell的配置方法(比如tableView(_:cellForRowAt:)里) let datePicker = NoLongPressDatePicker() datePicker.datePickerMode = .dateAndTime datePicker.locale = Locale(identifier: "en") datePicker.calendar = Calendar.current datePicker.preferredDatePickerStyle = .wheels textField.delegate = self textField.inputView = datePicker textField.inputAssistantItem.trailingBarButtonGroups.removeAll() textField.inputAssistantItem.leadingBarButtonGroups.removeAll() textField.tintColor = .clear
方案二:遍历DatePicker子视图禁用文本交互
如果不想自定义子类,可以通过遍历DatePicker的所有子视图,找到负责文本选择的组件并禁用交互:
// 封装成工具方法 func disableDatePickerTextInteraction(_ datePicker: UIDatePicker) { for subview in datePicker.subviews { if let textInput = subview as? UITextInput { textInput.isUserInteractionEnabled = false } else { // 递归处理子视图 disableDatePickerTextInteraction(subview as! UIDatePicker) } } } // 配置完DatePicker后调用 disableDatePickerTextInteraction(datePicker)
补充说明
之前在ViewController中生效但Cell里无效,大概率是UITableView的复用机制导致的——要确保在tableView(_:cellForRowAt:)方法中,每次复用cell时都重新执行DatePicker的配置和拦截逻辑,避免旧的状态残留。
内容的提问来源于stack exchange,提问作者kuma
相关产品推荐
相关产品推荐

