右键单击时,自定义`NSOutlineView`不显示上下文菜单

时间:2017-10-20 03:21:20

标签: swift macos cocoa nsoutlineview

我正在NSOutlineView中实现重命名/编辑功能。基本实现如下:

@objc func renameAction() {
    let row = outlineView.clickedRow
    let rowView = outlineView.view(
        atColumn: 0,
        row: row,
        makeIfNecessary: false) as! NSTableCellView

    rowView.textField!.isEditable = true
    rowView.window?.makeFirstResponder(rowView.textField!)
}

mouseDown:处理NSOutlineView,以便NSTextField点击正在编辑的行时退出编辑模式。 使用自定义委托的想法来自this question

override func mouseDown(with event: NSEvent) {
    super.mouseDown(with: event)
    let localLocation = self.convert(
        event.locationInWindow,
        from: nil)

    let clickedRow = self.row(at: localLocation)
    #if DEBUG
        print(#file, #line, clickedRow)
    #endif
    if clickedRow != -1 {
        self.extendedDelegate?.didClickRow(clickedRow)
    }
}

在代表中:

func didClickRow(_ row: Int) {
    //... get the textField
    textField.isEditable = false
    textField.resignFirstResponder()
    textField.window?.makeFirstResponder(
        textField.window?.contentView
    )
}

奇怪的是我可以右键点击NSTableCellView(包括图标和NSTextField)以获取上下文菜单 左键单击任何行。左键单击后,我只能通过右键单击NSTableCellView之外的任何位置(任何行,无论是否是单击的行),但是在行内({{1 }})。

截图

在任何左键点击之前,右键点击NSTableCellView会获得菜单:

Right clicked to get a menu

在任何行上单击鼠标左键后,右键单击不会在所有NSTableCellView上“开启”,但仍可在该行的空白区域内使用。

Right clicked on the "CG" but got nother //点击NSTableCellView后没有菜单。但是点击该行的空白区域时会出现菜单。

更新

我发现,如果覆盖的NSTableCellView已被注释掉(正如预期的那样),则没有问题。但是,这将通过单击当前行来结束编辑。

0 个答案:

没有答案