Все обсуждали, как избавиться от синего контура при щелчке правой кнопкой мыши... кроме меня.
Вместо этого я пытаюсь отобразить синий контур.
Я не получил никакого контура, когда щелкнул правой кнопкой мыши строку представления контура. Меню появилось, а контура нет.
Вы можете видеть, что синий контур не виден на этом рисунке ниже:
Ниже приведено то, чего я пытаюсь достичь.
Обновить
Вот как я реализовал NSMenu
. Я создал подкласс NSOutlineView
и создал новый протокол для переопределения NSOutlineViewDelegate
.
Идея заключалась в том, чтобы упростить задачу, позволив NSOutlineView
запрашивать у NSMenu
каждый элемент, чтобы мы могли реализовать разные меню для каждого элемента. Это работает, но синий контур не отображается при щелчке правой кнопкой мыши.
KRMenuOutlineView.swift
import Cocoa
@objc protocol KRMenuOutlineViewDelegate: NSOutlineViewDelegate {
// This method will ask NSMenu for each item in outline view
func outlineView(_ outlineView: KRMenuOutlineView, menuFor item: Any, event: NSEvent) -> NSMenu?
}
class KRMenuOutlineView: NSOutlineView {
override var delegate: NSOutlineViewDelegate? {
didSet {
if let newValue = delegate {
/*
* Swift doesn't support overriding inherited properties with different type
* like Objective C Does, therefore we need internal delegate.
*/
internalDelegate = unsafeBitCast(newValue, to: KRMenuOutlineViewDelegate.self)
} else {
internalDelegate = nil
}
}
}
private var internalDelegate: KRMenuOutlineViewDelegate?
override func menu(for event: NSEvent) -> NSMenu? {
let point = self.convert(event.locationInWindow, from: nil)
if let item = self.item(atRow: self.row(at: point)) {
return self.internalDelegate?.outlineView(self, menuFor: item, event: event)
}
return super.menu(for: event)
}
}
Затем я использую его в своем контроллере представления следующим образом:
KRTreeViewController.swift
extension KRTreeViewController: KRMenuOutlineViewDelegate {
func outlineView(_ outlineView: KRMenuOutlineView, menuFor item: Any, event: NSEvent) -> NSMenu? {
let menu = NSMenu(title: "Contextual Menu")
menu.delegate = self
let key = String(utf16CodeUnits: [unichar(NSBackspaceCharacter)], count: 1) as String
let deleteMenuItem = menu.addItem(withTitle: "Delete",
action: #selector(didClickMenuItem(_:)),
keyEquivalent: key)
deleteMenuItem.representedObject = myItem
deleteMenuItem.target = self
return menu
}
@objc fileprivate func didClickMenuItem(_ menuItem: NSMenuItem) {
// ...
}
}
NSOutlineView
по умолчанию? - person Willeke   schedule 29.07.2017super.menu(for: event)
перед возвратом собственного меню. - person Willeke   schedule 30.07.2017