如何在TableCellViews中处理/处理旧的NSTrackingAreas?

时间:2017-02-01 03:19:34

标签: swift mouseover nstableview

我有一个基于视图的NSTableView,每行都有一个NSTrackerArea。 NSTableView包含用户列表,并在用户加入和离开时更新。这就是我制作新单元格的方法:

        let cell = tableView.make(withIdentifier: "username",
        owner: self) as! NSTableCellView

        let aera = NSTrackingArea.init(rect: cell.bounds, options [
        NSTrackingAreaOptions.activeInKeyWindow,
        NSTrackingAreaOptions.inVisibleRect,
        NSTrackingAreaOptions.mouseEnteredAndExited],
        owner: self, userInfo: nil)

        cell.textField?.stringValue = name
        cell.addTrackingArea(aera)
        return cell

跟踪区域有效,但此实现会创建多层跟踪区域。

示例:聊天室中有10个用户,用户2离开。新用户加入,并在tableview中获取一行。但现在这个ViewCell有两个跟踪器,相互重叠。这会产生一些问题。

更糟糕的是,当我使用.reloadData()时,会为所有行创建一个新的跟踪器。我试图使用.updateTrackingAreas()和子类NSTableCellView来删除deinit中的跟踪器,但是其他工作。我也尝试为每一行创建跟踪器,而不是直接在单元格中进行跟踪,但我没有把它拉下来的技能。

你有什么想法吗?并提前感谢!

1 个答案:

答案 0 :(得分:0)

如果您每个单元格仅使用一个跟踪区域,那么您可以做的是确保在没有现有跟踪区域时仅添加跟踪区域。您可以通过检查cell.trackingAreas数组来查看它是否为空。在代码中,它应该如下所示:

let cell = NSTableCellView.init()

if cell.trackingAreas.count == 0 {
    let trackingArea = NSTrackingArea.init(rect: cell.bounds, options: [.activeInKeyWindow, .inVisibleRect, .mouseEnteredAndExited], owner: self, userInfo: nil)

    cell.addTrackingArea(trackingArea)
}

cell.textField.stringValue = name

return cell