Objective c NSTableView中的鼠标悬停检测';什么是NSCell?

Objective c NSTableView中的鼠标悬停检测';什么是NSCell?,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我想在tableview的单元格上悬停时更改其文本背景色,类似于鼠标悬停在标签名称上时AddressBook“高亮显示”联系人元素的标签。然而,我不知道如何完成 检测特定NSCell上的鼠标悬停,然后。。。 检测到他所停留的单元格后,突出显示该单元格中的文本(而不是像用户选择该行那样突出显示整行) 由于NSCell不是NSView的一个子类,这似乎是一项非常困难的任务 如能举任何例子或解释如何做到这一点,我们将不胜感激 谢谢 总的来说,这不是你所注意到的一项简单的任务 要在NSCell中跟踪鼠标

我想在tableview的单元格上悬停时更改其文本背景色,类似于鼠标悬停在标签名称上时AddressBook“高亮显示”联系人元素的标签。然而,我不知道如何完成

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

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

如能举任何例子或解释如何做到这一点,我们将不胜感激


谢谢

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

要在NSCell中跟踪鼠标,请创建NSCell子类并重写

-[NSCell startTrackingAt:inView:]   

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

以下是有关NSCell子类化的文档:

我实际上是用另一种方法让它工作的。我从这里发布的示例中得到它。。。

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

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

  • 我有一个BOOL ivar,当鼠标在跟踪区域内(mouseEntered)时设置为YES,当鼠标不在跟踪区域内(mouseExited)时设置为NO

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

  • 我还重写resetCursorRects以删除旧的跟踪rect并添加一个新的……当滚动tableview时,会调用此方法,以便跟踪最新的可见rect

  • 最后,在tableview的委托中,我确定所选行(通过从表视图的NSInteger ivar检索行索引,并更改单元格的文本颜色(或任何您想要的颜色),前提是当前绘制的单元格与鼠标光标所在的行相匹配。所有这些都是通过委托方法完成的:tableview:(NSTableView*)aTableView将显示单元格:(id)aCell forTableColumn:(NSTableColumn*)aTableColumn行:(NSInteger)行索引

  • 我希望这对其他人有所帮助,因为这有点棘手。在加载视图时,确保tableview是第一响应者可能也很重要,这只会使事情更加精简和干净


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

    我取得了一些成果类似的事情是,在我的NSTableView子类中为
    NSMouseMovedMask
    使用
    addGlobalMonitorForEventsMatchingMask:handler:
    添加GlobalMonitorForeventsMatchingMask:handler:
    ,再加上NSTableView的
    columnAtPoint
    rowAtPoint
    ,我可以确定鼠标的位置是否在给定范围内n细胞


    使用此信息,当鼠标在特定单元格上时,我能够弹出一个弹出框。

    感谢您提供的信息!出于某种原因,我的startTrakingAt:inView:或stopTracing:at:inView:mouseIsUp方法没有被调用…我知道我的表不支持选择,因为我不希望用户能够选择一行…我想知道如果这影响了这一点。您确定表中正在使用您的子类吗?也就是说,您是否将列的单元格作为自定义子类的实例?这是我第二次找到返回此答案的方法,并发现它很有用。谢谢!