NSTableView假装活跃

时间:2016-11-21 22:23:12

标签: macos cocoa nstableview nstextview first-responder

我有NSTextView,我想使用NSTableView显示自动完成选项(如Xcode自动完成)。问题是当textView是第一个响应者时,tableView显示为未聚焦(这是真的),但我想假装它也是活动的。有没有一种简单的方法来实现这一点(firstResponder textView和tableView具有活动的单元格选择颜色)?

1 个答案:

答案 0 :(得分:0)

所以我设法通过大量实验解决了这个问题。 这是我的解决方案:

设置NSTableView:

tableView.refusesFirstResponder = true
tableView.selectionHighlightStyle = .none

在NSTableCellView子类上实现以下代码:

override func awakeFromNib() {
    super.awakeFromNib()

    registerNotifications()
}

deinit {
    unregisterNotifications()
}

private func registerNotifications() {
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(selectionIsChanging),
                                           name: NSNotification.Name.NSTableViewSelectionIsChanging,
                                           object: nil)
}

private func unregisterNotifications() {
    NotificationCenter.default.removeObserver(self)
}

@objc private func selectionIsChanging() {
    if let row = superview as? NSTableRowView, row.isSelected == true {
        self.backgroundColor = NSColor.alternateSelectedControlColor
    } else {
        self.backgroundColor = NSColor.clear
    }
}