Tout le monde a discuté sur la façon de se débarrasser du contour bleu pendant le clic droit ... mais moi.NSOutlineAfficher comment afficher le contour bleu pendant le clic droit
Au lieu de cela, J'essaie d'afficher le contour bleu.
Je n'ai pas obtenu de contour lorsque j'ai cliqué avec le bouton droit sur ma ligne de vue générale. Le menu est apparu mais le contour n'était pas.
Vous pouvez voir que le contour bleu est pas visible dans cette image ci-dessous:
Voici ce que je suis en train de réaliser.
Mise à jour
Voilà comment je mis à exécution les NSMenu
. J'ai sous-classé le NSOutlineView
et fait un nouveau protocole pour remplacer NSOutlineViewDelegate
.
Cette idée était de rendre simple en laissant le NSOutlineView
demander le NSMenu
pour chaque article, afin que nous puissions implémenter un menu différent pour chaque article. Cela fonctionne mais la vue de contour bleue n'apparaît pas pendant le clic droit.
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)
}
}
Puis, je l'utilise dans mon contrôleur de vue comme celui-ci:
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) {
// ...
}
}
Nous ne savons pas ce que vous avez fait pour faire disparaître le contour bleu. Comment avez-vous implémenté le menu contextuel? Avez-vous fait quelque chose pour modifier un comportement par défaut de 'NSOutlineView'? – Willeke
@Willeke J'ai mis à jour ma question. –
Essayez d'appeler 'super.menu (for: event)' avant de retourner votre propre menu. – Willeke