如何解决如何在 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
}
}
在这两种情况下,我都会让所有行都带有红色文本:
在调试时,我可以看到:
-
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 举报,一经查实,本站将立刻删除。