在NSTableCellView上鼠标悬停

时间:2015-05-06 13:43:04

标签: objective-c macos cocoa

我为OS X 10.9和OS X 10.10开发了一个应用程序。这个应用程序有2个视图:

  • 登录视图
  • 历史记录视图

在登录视图中,用户只应插入用户名和密码。当用户按下“登录”按钮时,它会调用Web服务来授权用户查看新闻。

当用户被登录时,应用程序会显示历史记录视图,其中存储了所有已发送的新闻。要检索此消息,它会调用Web服务来获取包含所有新闻历史记录的JSON。要显示我使用HCKU\Software\Microsoft\Microsoft SQL Server\100的所有新闻。

当用户将鼠标移到此NSTableView的一行时,该行的背景变为灰色。

一切都运行得很好,但为了不断更新新闻列表,我每隔10秒就调用一次网络服务获取历史新闻,所以我将以下代码放入NSTableView

HistoryViewController

其中[NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(sendRequestToUrl) userInfo:nil repeats:YES]; 是从Web服务获取历史记录的方法。因此每次重新加载新闻列表时,它都会显示我没有鼠标悬停在一行上。为什么?

要绘制鼠标,请在我的自定义单元格类中插入以下代码:

sendRequestToUrl

知道为什么它不能正常工作吗?

谢谢

1 个答案:

答案 0 :(得分:2)

基于视图的表视图在不同时间重用不同单元格(行)的单元格视图。因此,一旦设置了一个单元格视图的子视图的图像,即使从表中删除单元格视图,然后将其添加回表格以用于其他单元格,它也将保持这种状态。

您可以尝试覆盖-prepareForReuse并将可能已自定义的所有内容重置为默认状态。

对于它的价值,您通常应在覆盖整个视图的跟踪区域的选项中指定NSTrackingInVisibleRect。这使得AppKit可以在跟踪区域移动或更改大小时将跟踪区域更新为视图的屏幕位置,尤其是在滚动视图中。否则,您必须覆盖-updateTrackingAreas以删除并重新添加视图新位置的跟踪区域。