NSTableView选中时更改单元格颜色

时间:2017-04-12 00:27:44

标签: macos nstableview

这是 macOS 问题

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?

我正在使用

 func tableViewSelectionDidChange(_ notification: Notification) {


    cell.layer?.backgroundColor = mintGreen.cgColor

更改单元格颜色。

选择单元格时是否可以更改颜色?

由于

2 个答案:

答案 0 :(得分:1)

你有没有得到这个?

意识到这是一个老问题了,但是我找不到任何地方记录的该问题的解决方案,所以这是我想出的:

此代码假定NSTableView具有一列,因此您感兴趣的单元格位于零索引列中。它还假定在'theTableView'的委托上对NSTableView的引用。

func tableViewSelectionDidChange(_ notification: Notification) {

    // You'd probably want to handle this else statement more elegantly
    guard let selected = theTableView?.selectedRow else { return }

    if (selected != -1) {

        if let numberOfRows = theTableView?.numberOfRows {

            let sequenceOfRows = 0..<numberOfRows

            for row in sequenceOfRows.reversed() {

                if row == selected {

                    if let cell = theTableView?.view(atColumn: 0, row: selected, makeIfNecessary: false) {
                        cell.layer?.backgroundColor = NSColor.green.cgColor
                    }

                } else {

                    if let cell = theTableView?.view(atColumn: 0, row: Int(row), makeIfNecessary: false) {
                        cell.layer?.backgroundColor = NSColor.clear.cgColor
                    }
                }

            }
        }

    } else {

        // No row is selected, so iterate over all and revert background to .clear

        if let numberOfRows = theTableView?.numberOfRows {

            let sequenceOfRows = 0..<numberOfRows

            for row in sequenceOfRows {

                if let cell = theTableView?.view(atColumn: 0, row: Int(row), makeIfNecessary: false) {
                    cell.layer?.backgroundColor = NSColor.clear.cgColor
                }

            }
        }
    }
}

这可行,并且从技术上回答了这个问题,但是感觉真的很糟糕,必须遍历所有行以评估要更改的背景色,并在行选择更改或取消选择该行时再次将所有行更改回。我禁不住觉得必须有更多优雅或有效的方法来执行此操作,但是正如我所说的,找不到自己的文档。

如果还有其他更简洁的方法可以进行更新,或者除NSTableView委托人之外还有其他模式可以实现此目的,请感谢其他人。

答案 1 :(得分:1)

您是否尝试过使用NSTableRowView的子类设置行视图。您可以在子类中覆盖图形。或者只是根据项目设置行的背景颜色。

func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView? {
        switch (item as! NSTreeNode).representedObject {
        case _ as FixtureNode:
            return OSFixtureTableHeaderRowView()
        default:
            return nil
        }
    }

我花了很长时间才弄清楚这个问题,因此对感兴趣的任何人来说,这都是一个短片段,其中显示了一个自定义大纲视图,该列表在列表视图的框中显示了分组的项目。我还没有弄清楚如何确定轮廓视图何时失去焦点来相应地更改选择颜色,但是对于此应用程序,最好是用户可以轻松查看当前选择,因此没有即时要求,但是如果有人指出让我们知道。如果有人需要帮助,很乐意发布更多详细信息。 Custom NSOutlineView enter image description here