【问题标题】:Correct behaviour of Mouse down inside row of NSTableView?鼠标在 NSTableView 行内的正确行为?
【发布时间】:2015-08-03 05:11:38
【问题描述】:

我有一个基于 NSView 的 NStableView。在每一行还有一个 NSImageView,它是 NSView 的子视图。我已经继承了这个 NSImageView 然后重写了 mouseDown 方法。问题是 tableViewSelectionDidChange 在用户单击此图像视图时也会被触发。我只想调用 mouseDown 而不是 tableViewSelectionDidChange。

如果我将表格的 selectionHighlightStyle 设置为 NSTableViewSelectionHighlightStyle.None,那么只会调用图像视图的 mouseDown。如果我不将 selectionHighlightStyle 赋予 NSTableViewSelectionHighlightStyle.None 则 imageview 的 mouseDowntableViewSelectionDidChange 都会被调用.将 selectionHighlightStyle 设置为 none 似乎可以解决我的问题,但这是正确的方法吗?或者我因为 appkit 中的一些错误而出现这种行为?

我也无法在某处找到此行为的记录。

【问题讨论】:

    标签: swift cocoa nstableview nsview nsimageview


    【解决方案1】:

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

    您可以更好地控制哪个视图将获得鼠标事件,而不必求助于更改表格视图选择样式之类的“hackery”。

    来自苹果文档:

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

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

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

    对所有提议的第一响应者视图返回 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

    【讨论】:

    • 谢谢。我将其子类化并针对我的问题状况返回 true。完美运行。
    猜你喜欢
    • 2012-12-08
    • 2012-04-19
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2012-11-14
    相关资源
    最近更新 更多