如何监听iOS中UIDatePicker(Compact样式)的消失事件?
监听Compact样式UIDatePicker的消失事件
对于UIDatePickerStyle.compact样式的时间选择器,系统没有直接提供监听其弹出面板消失的事件,但可以通过以下两种方式实现需求:
方法一:结合UITextField使用(推荐)
Compact样式的选择器通常和输入框配合使用,可利用UITextField的编辑结束事件来监听选择器面板的消失,这种方式基于系统公开API,兼容性和稳定性最佳:
// 创建输入框并添加到视图 let dateTextField = UITextField(frame: CGRect(x: 20, y: 100, width: 200, height: 44)) dateTextField.borderStyle = .roundedRect view.addSubview(dateTextField) // 创建Compact样式时间选择器 let picker = UIDatePicker() picker.preferredDatePickerStyle = .compact picker.datePickerMode = .time // 将选择器设为输入框的输入视图 dateTextField.inputView = picker // 监听时间变更事件 picker.addTarget(self, action: #selector(startTimeChanged(sender:)), for: .valueChanged) // 监听选择器消失(输入框编辑结束) dateTextField.addTarget(self, action: #selector(pickerDidDismiss), for: .editingDidEnd) @objc func startTimeChanged(sender: UIDatePicker) { // 更新输入框显示的时间 let formatter = DateFormatter() formatter.timeStyle = .short dateTextField.text = formatter.string(from: sender.date) } @objc func pickerDidDismiss() { // 处理选择器消失后的逻辑 print("时间选择器已关闭") }
方法二:监听Popover消失事件(不推荐,涉及私有属性)
如果不想使用输入框,可以通过获取系统内部的Popover控制器监听消失,但该方法用到私有属性,存在App Store拒审风险:
// 创建Compact样式选择器并添加到视图 let picker = UIDatePicker(frame: CGRect(x: 20, y: 100, width: 200, height: 44)) picker.preferredDatePickerStyle = .compact picker.datePickerMode = .time view.addSubview(picker) // 监听时间变更和选择器点击事件 picker.addTarget(self, action: #selector(startTimeChanged(sender:)), for: .valueChanged) picker.addTarget(self, action: #selector(pickerWasTapped), for: .touchUpInside) @objc func startTimeChanged(sender: UIDatePicker) { // 处理时间变更逻辑 } @objc func pickerWasTapped() { // 延迟执行,确保Popover已初始化完成 DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { if let popover = self.picker.value(forKey: "_popoverPresentationController") as? UIPopoverPresentationController { popover.delegate = self } } } // 遵循Popover代理协议 extension YourViewController: UIPopoverPresentationControllerDelegate { func popoverPresentationControllerDidDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) { // 处理选择器消失后的逻辑 print("时间选择器已关闭") } }
注意:方法二中的
_popoverPresentationController是系统私有属性,Apple可能在后续版本修改或禁用该属性,提交审核时也可能被拒绝,仅建议在测试场景使用。
内容的提问来源于stack exchange,提问作者sudoExclamationExclamation
相关产品推荐
相关产品推荐

