swift - 如何处理/处置 TableCellViews 中旧的 NSTrackingAreas?

标签 swift mouseover nstableview

我有一个基于 View 的 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 中删除跟踪器,但两者都不起作用。我还尝试为每一行创建跟踪器,而不是直接在单元格中执行,但我没有能力实现它。

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

最佳答案

如果每个单元格仅使用一个跟踪区域,那么您可以做的是确保仅在不存在现有跟踪区域时添加跟踪区域。您可以通过检查 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

关于swift - 如何处理/处置 TableCellViews 中旧的 NSTrackingAreas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41971351/

相关文章:

ios - 显示可达性状态的警报

ios - 使用 swift 更改自定义属性检查器值

ios - 如何检测我是否点击了 SKShapeNode

ios - ScrollView 不水平滚动

javascript - Jquery鼠标悬停事件问题

c++ - Qt 中鼠标悬停在透明度上

cocoa - 如何在 NSTableView 中单击 NSTextFieldCell 进行编辑?

cocoa - NSScrollView Bar 不滚动 NSTableView 行

html - 悬停时覆盖的背景

cocoa - NSTableView 和 NSCollectionView 之间的区别