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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:39:24