我有一个基于 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/