如何解决NSTableView中NSDatePicker组件无法直接选中的问题?
NSTableView中NSDatePicker点击触发行选中的解决方法
问题描述
我的NSTableView每行包含一个Popup Button和一个NSDatePicker。点击Popup Button时表现正常:菜单弹出且可修改选中项。但点击NSDatePicker的日期组件时,NSTableView的行会被选中(类似点击不可编辑文本字段时的行选中行为);只有先点击右侧的上下箭头步进器,首个日期组件才会被选中,之后才能点击其他组件。
可行解决方案
方案1:自定义NSDatePicker拦截事件
创建自定义NSDatePicker子类,在鼠标点击时优先激活自身编辑状态,并阻止事件传递给表格行:
class CustomDatePicker: NSDatePicker { override func mouseDown(with event: NSEvent) { self.becomeFirstResponder() super.mouseDown(with: event) event.stopPropagation() } }
之后将Storyboard或代码中对应的NSDatePicker类替换为CustomDatePicker即可。
方案2:通过NSTableView代理控制行选中
实现NSTableView的代理方法,判断点击位置是否为NSDatePicker,若是则禁止行选中:
extension YourViewController: NSTableViewDelegate { func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { let clickPoint = tableView.convert(NSEvent.mouseLocation, from: nil) if let targetView = tableView.view(at: clickPoint, in: nil), targetView is NSDatePicker { return false } return true } }
额外注意事项
确保NSDatePicker的isEnabled属性设为true,且allowsEditingTextAttributes处于开启状态,保证控件本身具备可交互性。
内容的提问来源于stack exchange,提问作者Nickkk
相关产品推荐
相关产品推荐

