Swift 如果鼠标位于行上方,则快速取消隐藏一列中的按钮
我正在为osx使用swift 4。 我有一个4列的基于视图的NSTableView。 每列中的单元格具有相同的自定义单元格类: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
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的工作,因为它不是控制器。