如果鼠标在行上,则在一列中快速取消隐藏按钮

时间:2017-08-23 13:52:33

标签: swift macos cocoa nstableview

我使用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将为nil

逻辑上:因为此按钮仅在第4列可用。 在所有其他列中,它将是零。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

解决方案是在整个视图中添加NSTrackingArea,而不是单个单元格。然后在整个表格视图中,您可以获取鼠标移动事件,获取NSEvent的{​​{1}}。然后,locationInWindow有一个方法NSTableView,可以获取应该突出显示该按钮的当前行。