在我的表视图中,每一行都包含一个弹出按钮和一个日期选择器。单击弹出按钮时,它的行为符合预期:出现菜单,我可以更改所选项目。但是当点击日期选择器的日期组件时,表格视图行被选中,就像我点击一个非交互式控件一样(例如,当点击一个不可编辑的文本字段时,表格视图选择也会改变).只有当单击步进器(右侧的向上/向下箭头)时,才会选择第一个日期组件,然后我也可以单击其他组件。
我可以更改此行为,以便单击日期选择器的行为就像我直接与其交互一样,而不是表格视图吗?
日期选择器似乎与表视图中的文本字段不同。虽然我可以通过第一次点击激活文本字段,但点击日期选择器首先选择表格行,然后第二次点击选择日期选择器组件。
当使用
NSTableViewDelegate.tableView(_:shouldSelect:)
禁用表格视图选择并返回 false
时,虽然文本字段仍然可以激活,但日期选择器不再响应(除非先单击右侧的步进器)。
不过,其他答案的解决方案(如 @Willeke 的评论中所述)也适用于此。
class MyTableView: NSTableView {
override func hitTest(_ point: NSPoint) -> NSView? {
let myPoint = superview!.convert(point, to: self)
let column = column(at: myPoint)
let row = row(at: myPoint)
if row >= 0, column >= 0, let cell = view(atColumn: column, row: row, makeIfNecessary: false), let datePicker = cell.hitTest(convert(myPoint, to: cell.superview)) as? NSDatePicker {
return datePicker
} else {
return super.hitTest(point)
}
}
}