NSTableView 选择时更改单元格颜色

问题描述 投票:0回答:3

这是一个 macOS 问题

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

我正在使用

 func tableViewSelectionDidChange(_ notification: Notification) {


    cell.layer?.backgroundColor = mintGreen.cgColor

更改单元格颜色。

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

谢谢

macos nstableview
3个回答
2
投票

你对此有什么进展吗?

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

此代码假设 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
投票

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

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

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


0
投票

老话题,但仍然是一个有效的问题。 将表格突出显示样式设置为 none 并执行我自己的选择系统(通过更改视图根层颜色或添加视图作为叠加层,这允许复杂的选择器)对我来说效果很好。

tableView.selectionHighlightStyle = .none
© www.soinside.com 2019 - 2024. All rights reserved.