【问题标题】:NSTableView Change cell color when selectedNSTableView 选中时更改单元格颜色
【发布时间】:2020-05-21 08:11:05
【问题描述】:

这是一个ma​​cOS问题

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

我正在使用

 func tableViewSelectionDidChange(_ notification: Notification) {


    cell.layer?.backgroundColor = mintGreen.cgColor

改变单元格颜色。

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

谢谢

【问题讨论】:

  • 在选定行或焦点文本字段中选定?
  • 感谢您的回复。我已经更新了问题
  • 参见stackoverflow.com/a/29474301/43615 - 这似乎对我有用,因为每次选择更改时我都会在 NSTableViewRow 子类中调用 drawRect。

标签: macos nstableview


【解决方案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 委托之外还有其他模式可以实现这一点,如果其他人可以更新,我将不胜感激。

【讨论】:

  • 我从来没有解决过这个问题,所以感谢您的修复!欢迎来到 StackOverflow!
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢邓肯。我会用这个方法玩。
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2014-08-24
  • 1970-01-01
  • 2012-01-23
  • 2011-04-27
相关资源
最近更新 更多