我使用 swift 4 for osx。 我有一个基于 NSTableView 的视图,有 4 列。 每列中的单元格具有相同的自定义单元格类:
class CustomCell: NSTableCellView {
@IBOutlet weak var btnInfo: NSButton!
private var trackingArea: NSTrackingArea!
override func awakeFromNib() {
super.awakeFromNib()
self.trackingArea = NSTrackingArea(
rect: bounds,
options: [.activeAlways, .mouseEnteredAndExited],
owner: self,
userInfo: nil
)
addTrackingArea(trackingArea)
}
override func mouseEntered(with event: NSEvent) {
super.mouseEntered(with: event)
btnInfo.isHidden = false
}
override func mouseExited(with event: NSEvent) {
super.mouseExited(with: event)
btnInfo.isHidden = true
}
}
现在我想实现以下情况:
如果用户将鼠标悬停在一行上,则btnInfo应该是可见的,并且再次隐藏,鼠标离开该行。
问题是(使用上面的代码(,我的应用程序崩溃了,因为 btnInfo 将为零
逻辑上:因为此按钮仅在第 4 列中可用。 在所有其他列中,它将为零。
我该如何解决这个问题?
解决方案是向整个视图添加NSTrackingArea
,而不是单个单元格。然后在整个表格视图上,可以得到鼠标移动事件,取NSEvent
的locationInWindow
。然后NSTableView
有一个方法row(at point: NSPoint) -> Int
,可以让你得到应该突出显示按钮的当前行。