大家討論瞭如何在右鍵點擊時擺脫藍色輪廓......但我。NSOutlineView如何在右鍵點擊時顯示藍色輪廓
而是,我試圖顯示藍色輪廓。
當我右鍵單擊我的大綱視圖行時,我沒有得到任何大綱。菜單出現了,但輪廓不是。
你可以看到藍色的輪廓是不是在下面這張圖可見:
下面就是我想要的目的。
更新
我這是怎麼實現的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'的默認行爲? – Willeke
@Willeke我更新了我的問題。 –
嘗試在返回自己的菜單之前調用'super.menu(for:event)'。 – Willeke