微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Swift 5 中为基于单元格的 NSTableVew 中的单个行着色

如何解决如何在 Swift 5 中为基于单元格的 NSTableVew 中的单个行着色

我正在尝试在 NSTableView显示项目,但其中一个(之前由操作激活的项目(其名称存储在 alreadyActivatedItem 变量中))应该被禁用并显示为红色文字

到目前为止,我设法使禁用正常工作。

我只是无法将已激活的项目着色为红色文本。我下面的代码会将所有单元格的文本都涂成红色。

extension PreferencesViewController: NSTableViewDelegate {
    
    // disable selecting the already activated item
    func tableView(_ tableView: NSTableView,shouldSelectRow row: Int) -> Bool {
                        
        return !(myArray[row].name == alreadyActivatedItem)
    }
    
    // colouring the already activated item in red (it is also disabled)
    func tableView(_ tableView: NSTableView,willdisplayCell cell: Any,for tableColumn: NSTableColumn?,row: Int) {
        
        guard let c = cell as? NSTextFieldCell else {
            return
        }

        if c.stringValue == alreadyActivatedItem {
            c.textColor = .red
        }

    }
}

我也尝试了另一种方式:

// colouring the already activated item in red (it is also disabled)
func tableView(_ tableView: NSTableView,row: Int) {

    guard let c = tableColumn?.dataCell(forRow: row) as? NSTextFieldCell else {
        return
    }
    
    if c.stringValue == alreadyActivatedRow {
        c.textColor = .red
    }
}

在这两种情况下,我都会让所有行都带有红色文本:

see as all items are red text

在调试时,我可以看到:

  • let c = cell as? NSTextFieldCell 似乎获取了当前行的单元格,至少我使用 stringValue 正确获取了行的 c.stringValue
  • if c.stringValue == alreadyActivatedRow 似乎运行良好,至少只有在条件为真时才会进入。

那为什么所有的物品仍然是红色的?

那么如何实现我的目标?

(Xcode 11.3.1,Swift 5.1.3)

解决方法

细胞被重复使用。您必须添加一个 else 子句以将颜色始终设置为定义的状态。

if c.stringValue == alreadyActivatedItem {
    c.textColor = .red
} else {
    c.textColor = .black
}

或者更简单

 c.textColor = c.stringValue == alreadyActivatedItem ? .red : .black

我什至推荐基于视图的表视图和 Cocoa Bindings。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。