鼠标在NSTableView行内的正确行为?

时间:2015-08-03 05:11:38

标签: swift cocoa nstableview nsview nsimageview

我有一个基于NSView的NStableView。在每一行中还有一个NSImageView,它是NSView的子视图。我已将此NSImageView子类化,然后覆盖 mouseDown 方法。当用户点击此imageview时,问题是 tableViewSelectionDidChange 也会被触发。我只想要 mouseDown 而不是tableViewSelectionDidChange。

如果我将表格的 selectionHighlightStyle 设置为 NSTableViewSelectionHighlightStyle.None ,则只会调用图像视图的 mouseDown 。如果我不将 selectionHighlightStyle 提供给 NSTableViewSelectionHighlightStyle.None ,则会调用imageview的 mouseDown tableViewSelectionDidChange 。将 selectionHighlightStyle 设置为无似乎可以解决我的问题,但这是正确的approch吗?或者我因为appkit中的一些错误而得到这种行为?

此外,我无法在某处找到此行为。

1 个答案:

答案 0 :(得分:1)

我认为您正确的方法是继承NSTableView并覆盖NSResponder方法-(BOOL)validateProposedFirstResponder:(NSResponder *)responder forEvent:(NSEvent *)event

您可以更好地控制哪个视图将获得鼠标事件,并且不必像更改表视图选择样式那样诉诸“hackery”。

来自apple docs:

  

指定子视图应如何响应事件

     

表中的视图或控件有时需要响应传入的事件。要确定特定子视图是否应该接收当前鼠标事件,表视图在其hitTest实现中调用validateProposedFirstResponder:forEvent :.如果创建表视图子类,则可以覆盖validateProposedFirstResponder:forEvent:以指定哪些视图可以成为第一个响应者。这样,您就会收到鼠标事件。

     

validateProposedFirstResponder的默认NSTableView实现:forEvent:使用以下逻辑:

     

对于所有提议的第一响应者视图,返回YES,除非它们是NSControl的实例或子类。   确定建议的第一响应者是NSControl实例还是子类。

     

如果控件是NSButton对象,则返回YES。

     

如果控件不是NSButton,则调用控件的hitTestForEvent:inRect:ofView:查看命中区域是否可跟踪(即NSCellHitTrackableArea)或者是可编辑的文本区域(即NSCellHitEditableTextArea),并返回适当的价值。请注意,如果文本区域被点击,NSTableView也会延迟第一个响应者操作。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/RowSelection/RowSelection.html#//apple_ref/doc/uid/10000026i-CH6-SW9