如何在 macOS cocoa 上使用鼠标悬停时突出显示的单元格创建 table?

How to create table with highlighted-on-mouseover cells on macOS cocoa?

我正在尝试创建一个 table 与 Dropbox 的弹出窗口视图非常相似的托盘弹出窗口应用程序。 有一个 table 个文件,当您将鼠标悬停在 table 个单元格上时,单元格将突出显示并显示其他控件。 我不确定 NSTableView 是否是 suitable 的? 有人有什么建议吗?

这将是 NSTableView 的理想用途。使用基于视图的 NSTableView,您将能够轻松地创建这些单元格(视图)的外观。如果您使用 -[NSView addTrackingArea:]NSTrackingArea 添加到 table 视图(滚动视图可能更好),鼠标悬停时的突出显示应该可以实现,这会为您提供 -mouseMoved: 的回调事件。通过该方法,您可以在 NSEvent 上使用 locationInWindow 属性,然后使用 NSTableView 的 -rowAtPoint: 调用来查询您应该更改哪一行以显示悬停事件。

作为此处可能的修正,我必须执行以下操作才能完成此工作:

highlightedRow: MyCustomRow?

func viewWillAppear(){
    configureTableHighlight()
}

func configureTableHighlight() {
    let trackingArea = NSTrackingArea(rect: scrollView.frame, options: [.mouseMoved, .activeInKeyWindow, .inVisibleRect], owner: self, userInfo: nil)
    scrollView.addTrackingArea(trackingArea)
}

override func mouseMoved(with event: NSEvent) {
    let pointInTableView = tableView.convert(event.locationInWindow, to: nil)
    let row = tableView.row(at: pointInTableView)
    
    if row == -1 {
        highlightedRow?.highlight = false
        highlightedRow = nil
        return
    }
    
    guard let view = tableView.view(atColumn: 0, row: row, makeIfNecessary: false) as? MyCustomRow else {
        return
    }
    
    if(highlightedRow == view){
        return
    }
    
    view.highlight = true;
    highlightedRow?.highlight = false
    highlightedRow = view;
}

但这可能取决于您添加 trackingView 的位置。

附加参考:

mouseover detection in NSTableView's NSCell?