在NSTableView的NSCell中检测鼠标悬停?

时间:2010-05-07 06:53:21

标签: objective-c cocoa macos

我希望在桌面视图上悬停时更改文本背景颜色,类似于当鼠标悬停标签名称时,AddressBook“突出显示”联系人元素的标签。但是我无法弄清楚如何完成......

检测特定NSCell上的鼠标悬停并... 在检测到他盘旋的单元格后,突出显示该单元格中的文本(不突出显示整行,就像用户选择该行一样)

由于NSCell不是NSView的子类,因此这似乎是一项非常困难的任务。

非常感谢任何关于如何做到这一点或解释的例子。

谢谢!

3 个答案:

答案 0 :(得分:10)

我实际上是使用其他方法工作了。我从这里发布的例子中得到了它... http://www.cocoadev.com/index.pl?NSTableViewRollover https://web.archive.org/web/20111013060111/http://cocoadev.com/index.pl?NSTableViewRollover

我没有使用NSCell的跟踪机制,而是在我的子类NSTableView中跟踪mouseEntered / mouseExited和mouseMoved。

  1. 当调用tableview awakeFromNib方法时,我从tableview的可见部分创建一个trackingRect

  2. 我有一个BOOL ivar,当鼠标位于跟踪区域(mouseEntered)时设置为YES,当它不在时,设置为NO(mouseExited)

  3. 在mouseMoved方法中,我确定鼠标光标所在的当前行并将其设置为NSInteger ivar,然后调用tableview的setNeedsDisplayInRect:传递鼠标所在行的矩形。

  4. 我还覆盖resetCursorRects以删除旧的跟踪矩形并添加一个新的...当滚动tableview时调用此方法,以便它跟踪最新的可见rect。

  5. 最后在我的tableview的委托中,我确定所选行(通过从表视图的NSInteger ivar中检索行索引并更改单元格的文本颜色(或任何你想要的),如果当前绘制的单元格与所有这些都在委托方法中完成:tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn行:(NSInteger)rowIndex

  6. 我希望这有助于其他人,因为这有点棘手。确保tableview是视图加载时的第一个响应者也很重要,只需使事情更简洁,更清晰。

    是的,有没有办法在视图中进行特定控制总是第一个响应者,没有其他可能作为第一个响应者?甚至像iPhone这样的方法... viewWillAppear方法也会有所帮助,因为每当视图可见时我都可以设置第一个响应者...但我不知道Mac上有这样的方法。

答案 1 :(得分:3)

总的来说,这并不像你注意到的那么简单。

在NSCell中跟踪鼠标,子类NSCell并覆盖

-[NSCell startTrackingAt:inView:]   

-[NSCell stopTracking:at:inView:mouseIsUp:]      

一旦检测到鼠标在单元格内进行跟踪,您就可以找到表格中包含[tableView rowAtPoint:point]和[tableView columnAtPoint:point]的单元格,然后找到{{1 }} 然后,您可以通过更改单元格的某些属性或通过覆盖[tableView frameOfCellAtColumn:column row:row]来更改直接绘制单元格的方式来更改单元格的绘制方式。

这是关于子类化NSCell的文档: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ControlCell/Tasks/SubclassingNSCell.html

答案 2 :(得分:0)

通过在我的NSTableView子类中使用addGlobalMonitorForEventsMatchingMask: handler: NSEvent NSMouseMovedMask,我实现了类似的功能。使用此功能以及NSTableView的columnAtPointrowAtPoint,我能够确定鼠标的位置是否在给定的单元格内。

使用此信息,当鼠标悬停在特定单元格上时,我能够调出PopOver。