如何在macOS cocoa上创建带有突出显示鼠标悬停单元格的表格?

时间:2017-09-06 13:46:36

标签: macos cocoa mouseover nstablecellview

我正在尝试创建一个托盘弹出式应用程序,其表格与Dropbox在其弹出视图中的表格非常相似。 有一个文件表,当您将鼠标悬停在表格单元格上时,单元格将突出显示并显示其他控件。 我不确定NSTableView是否适用于此? 有没有人有任何建议?

Dropbox Popover Table WIth Highlighted Cell

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

作为这里的一个可能的修改,我必须做以下事情才能使这项工作:

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?

相关问题