【问题标题】:mouseover detection in NSTableView's NSCell?NSTableView 的 NSCell 中的鼠标悬停检测?
【发布时间】:2010-05-07 06:53:20
【问题描述】:

当鼠标悬停在表格视图的单元格上时,我想更改其文本背景颜色,类似于当您将鼠标悬停在标签名称上时地址簿如何“突出显示”联系人元素的标签。但是我无法弄清楚如何完成......

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

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

非常感谢任何有关此操作的示例或有关如何完成此操作的说明。

谢谢!

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

    我实际上是用另一种方法让它工作的。我从这里发布的示例中得到它... 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 以删除旧的跟踪矩形并添加一个新的...当滚动表格视图时调用此方法,以便跟踪最新的可见矩形。

    5. 最后,在我的 tableview 的委托中,如果当前绘制的单元格与鼠标光标所在的行。所有这些都在委托方法中完成:tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

    我希望这对其他人有所帮助,因为这有点棘手。确保在视图加载时 tableview 是 firstResponder 也很重要,这只会使事情更加精简和清洁。

    顺便说一句,有没有办法让视图中的特定控件始终成为 firstResponder 而没有其他可能成为 firstResponder?即使是 iPhone 之类的方法... viewWillAppear 方法也会有所帮助,因为我可以在每次视图可见时设置第一响应者...但我不知道 Mac 上有这种方法。

    【讨论】:

    • 这是我第二次找到返回此答案的方法并发现它很有帮助。谢谢!
    【解决方案2】:

    总的来说,这不是您注意到的一项简单的任务。

    要在 NSCell 中跟踪鼠标,继承 NSCell 并覆盖

    -[NSCell startTrackingAt:inView:]   
    

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

    一旦您检测到鼠标在单元格内跟踪,您可以使用[tableView rowAtPoint:point] 和[tableView columnAtPoint:point] 找出您在表格中的哪个单元格,然后使用[tableView frameOfCellAtColumn:column row:row] 找到您的框架 然后,您可以通过更改单元格的某些属性或通过覆盖drawInteriorWithFrame:inView: 直接更改其绘制方式来更改单元格的绘制方式。

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

    【讨论】:

    • 感谢您的信息!出于某种原因,我的 startTracingAt:inView: 或 stopTracing:at:inView:mouseIsUp 方法没有被调用...我知道我的表不支持选择,因为我不希望用户能够选择一行...我想知道这是否有影响。
    • 你确定你的子类正在表中使用吗?
    • 也就是说,你有没有让列的单元格成为你自定义子类的实例?
    【解决方案3】:

    我通过在NSMouseMovedMask 的 NSTableView 子类中使用 NSEvent 中的 addGlobalMonitorForEventsMatchingMask: handler: 实现了类似的效果。将它与 NSTableView 的 columnAtPointrowAtPoint 一起使用,我能够确定鼠标的位置是否在给定的单元格内。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2017-05-17
      • 2012-04-23
      • 2011-08-04
      相关资源
      最近更新 更多