誰もが右クリック中に青い輪郭を取り除く方法について議論しましたが、私はそうです。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