Swift 如果鼠标位于行上方,则快速取消隐藏一列中的按钮

Swift 如果鼠标位于行上方,则快速取消隐藏一列中的按钮,swift,macos,cocoa,nstableview,Swift,Macos,Cocoa,Nstableview,我正在为osx使用swift 4。 我有一个4列的基于视图的NSTableView。 每列中的单元格具有相同的自定义单元格类: class CustomCell: NSTableCellView { @IBOutlet weak var btnInfo: NSButton! private var trackingArea: NSTrackingArea! override func awakeFromNib() { super.awakeFro

我正在为osx使用swift 4。 我有一个4列的基于视图的NSTableView。 每列中的单元格具有相同的自定义单元格类:

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(在点:NSPoint)->Int
,可以获取应该高亮显示按钮的当前行。

解决方案是将
NSTrackingArea
添加到整个视图,而不是单个单元格。然后在整个表视图上,您可以获取鼠标移动事件,获取
NSEvent
locationInWindow
。然后,
NSTableView
有一个方法
row(在点:NSPoint)->Int
,它可以获取应该高亮显示按钮的当前行。

可以使用多个表格单元格视图。返回第4列的此单元格视图,并返回其他列的默认单元格视图或其他自定义单元格视图。您在错误的位置执行此操作。这不是NSTableCellView的工作,因为它不是控制器。您可以使用多个表单元格视图。返回第4列的此单元格视图,并返回其他列的默认单元格视图或其他自定义单元格视图。您在错误的位置执行此操作。这不是NSTableCellView的工作,因为它不是控制器。