我有一个基于视图的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中的跟踪器,但是其他工作。我也尝试为每一行创建跟踪器,而不是直接在单元格中进行跟踪,但我没有把它拉下来的技能。
你有什么想法吗?并提前感谢!
答案 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