NSTableView - 初始选择灰色,直到点击(焦点)

Posted

技术标签:

【中文标题】NSTableView - 初始选择灰色,直到点击(焦点)【英文标题】:NSTableView - Initial Selection Grey until Clicked (Focussed) 【发布时间】:2015-11-24 12:48:08 【问题描述】:

我在这里有一个简单的应用示例,我将它拼凑在一起,我得到的几乎就是我想要的。

问题是当视图加载时,在 NSViewController 的 viewDidLoad 中,我将 tableView 的选定索引设置为 0,即第一项(有效)。

我注意到的是,当这种情况发生时,所选行显示为灰色(即好像它不是活动窗口/视图)......当我物理单击时,它似乎仅以正常的蓝色突出显示在选定的行上。

我可以确认行 被选中并且一切正常。

有什么想法吗?

为了确认,我用来选择行的代码是:

override func viewDidAppear() 
    self.tableView.selectRowIndexes(NSIndexSet(index: 0), byExtendingSelection: false)

以下是实际视图本身发生的情况:

上图:较深的灰色线是“选择栏”。这就是视图一旦激活就会发生的情况。

上图:一旦我点击那一行(曾经是深灰色的那一行),我就会得到他想要的高光......即海军蓝。

【问题讨论】:

【参考方案1】:

单元格是灰色的原因是因为表格视图没有焦点/不是第一响应者。

tableView单元格选择颜色有3种状态

    无选择 = 清除行背景

    选择和焦点 = 蓝色行背景

    选择和无焦点 = 灰色行背景

这可能是因为另一个视图有焦点。简单地选择一个单元格不会将焦点转移到 tableView。你需要调用 NSWindow.makeFirstResponder() 来改变焦点。

func tableViewSelectionDidChange(notification: NSNotification) 
    let tableView = notification.object as! NSTableView
    if tableView.selectedRow != -1 
        self.window!.makeFirstResponder(self.tableView)
    

【讨论】:

【参考方案2】:

我已经设法找出发生了什么事。 (我认为)而且它似乎有效。

我不得不:

    子类NSTableRowView 在 Interface Builder 中的实际单元格视图(行)下方添加一个新的 NSView 将新行视图的类设置为“myNSTableViewSubClass” 设置 row view 的 Identifier 为:NSTableViewRowViewKey (这个很具体,字面意思就是key,如果不设置,就认为是Table Row View不起作用。

    在子类中,我必须重写 emphasised: Bool 以始终返回 yes,例如:

    override var emphasized: Bool
        get
            return true
        
        set
            //You need to have the "set" there as it's a mutable prop
            //It doesn't have to do untying though
        
    
    

然后瞧……

在我的案例中,问题在于上面的 4

【讨论】:

以上是关于NSTableView - 初始选择灰色,直到点击(焦点)的主要内容,如果未能解决你的问题,请参考以下文章

用内容重新加载我的 tableView 后,它仍然显示为灰色,直到我点击它..为啥?

Swift NSTableview 拖动选择多行而不是拖出表格

NSTableView 在 NSSplitView 中显示不正确

Swift & NSTableView - 只需选择一行

取消选择 NSTableView 行时出现异常

NSTableView 允许用户选择要显示的列