首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tableView(tableView,viewFor:,:Int)奇怪的行为

tableView(tableView,viewFor:,:Int)奇怪的行为
EN

Stack Overflow用户
提问于 2019-09-15 01:01:24
回答 1查看 31关注 0票数 0

我正在尝试创建一个基于视图的tableView委托方法来修改列的字体敌我,它的标识符是'name‘,它的值与某些全局值相匹配;否则,nib应该占上风。我想我不是有什么问题,就是我的逻辑漏掉了什么。

我有两个表,一个基于视图(tag=0),一个单元格(tag=1),两个表都有相同的视图控制器作为它们的委托。每个tableView都有一个唯一的标记和标识符,一个列值绑定的数组控制器,每个fits列都有一个显式的唯一标识符--匹配它的绑定;我试过省略它--“自动设置”--但是这没有产生任何数据!?

因此,我添加了这个方法,但是两个tableViews调用都在其中;我只期望第一个调用。第二表是第一列的细节,具有第一阵列控制器的选择。

代码语言:javascript
复制
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let item = ((tableView.dataSource as! NSArrayController).arrangedObjects as! [AnyObject])[row]
    var view = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self)
    if view ==  nil {
        Swift.print("tag: \(tableView.tag) ident: \(tableColumn!.identifier.rawValue)")
        view = NSTableCellView.init()
        view?.identifier = tableColumn?.identifier
    }

    guard tableView.tag == 0 else { return view }

    guard isGlobalPlist, item.name == '<some-global-string>',
        let identifier = tableColumn?.identifier,
        identifier.rawValue == "name" else { return view }

    if let cellView = view as? NSTableCellView {
        if tableView.selectedRowIndexes.intersection(IndexSet.init(integer: row)).count > 0 {
            cellView.textField?.font = .boldSystemFont(ofSize: -1)
            cellView.textField?.textColor = .white
        }
        else
        {
            cellView.textField?.font = .systemFont(ofSize: -1)
            cellView.textField?.textColor = .blue
        }
    }
    return view
}

首先,我注意到第二个表调用了该方法,而不是我所期望的,它是一个基于单元格的tableView。

无论如何,当0返回时,我确实创建了单元格,您只需要匹配标识符,文档就会引用:

Note that a cell view’s identifier must be the same as its table column’s identifier for bindings to work. If you’re using bindings, it’s recommended that you use the Automatic identifier setting in Interface Builder.

我这样做了;使用显式输入的列标识符将两个tableView的列(视图或单元格)绑定到各自的数组控制器。

无论如何,我所追求的最初意图是基于视图的(1) tableView:

  • 视图控制器控制全局资源(isGlobalPlist为真)
  • 行的“名称”值与全局值匹配

以不同的颜色(蓝色/黄色-或其他什么颜色)显示的影响“名称”单元格,这取决于是否由于选择高亮、黑暗模式等条件而选择行。

所以有四种可能性

  1. 选定的行,匹配全局->前:黄色,后退:默认
  2. 选定的行,不匹配全局->前:默认,回:默认
  3. 未选定的行,匹配全局->前:蓝色,后退:默认
  4. 未选定的行,不匹配全局->前:默认,回:默认

如果目标行与需求匹配,则颜色需要根据其包含在tableView所选索引中的内容而变化。

该设置似乎正确地影响了最初选定的行和匹配值,但随后设置似乎在导航到的其他行之间流血--因此选择发生了更改。最多应该有带有此影响的1行的name列。

我不知道我的逻辑或设置是否错误;我怀疑我在移动时可能需要刷新?

EN

回答 1

Stack Overflow用户

发布于 2020-01-24 01:23:39

我放弃了基于视图的解决方案,但这满足了我的需要;基于单元格的解决方案:

代码语言:javascript
复制
func tableView(_ tableView: NSTableView, dataCellFor tableColumn: NSTableColumn?, row: Int) -> NSCell? {
    guard let column = tableColumn else { return nil }

    let item : AnyObject = ([table0ArrayController,table1ArrayController][tableView.tag]?.arrangedObjects as! [AnyObject])[row]
    let cell : NSTextFieldCell = column.dataCell(forRow: row) as! NSTextFieldCell
    cell.textColor = .textColor

    guard tableView.tag == 0, isGlobalPlist, item.name == '<some-global-string>' else { return cell }

    if tableView.selectedRowIndexes.intersection(IndexSet.init(integer: row)).count > 0 {
        cell.textColor = .white
    }
    else
    {
        cell.textColor = .blue
    }

    return cell
}

我想提请注意特定行的颜色,除非行是为“名称”列选择的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57940370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档