Kontext-Menü basierend auf NSTableViewCell
ich würde gerne ein Kontext-Menü auf eine NSTableView
. dieser Teil ist getan. was würde ich liek, um zu tun ist, um zu zeigen, verschiedene Menü-Einträge auf der Grundlage der Inhalte der rechten Zelle geklickt, und NICHT zeigen Sie das Kontextmenü für bestimmte Spalten.
dies ist:
Spalte 0 und 1: kein Kontext-Menü
alle anderen Zellen sollten das Kontext-Menü wie dieses:
ersten Eintrag: "löschen" samerow.column1.Wert
zweiter Eintrag: "speichern" samecolumn.headertext
hoffe die Frage ist klar..
Dank
-BEARBEITEN-
die auf der rechten Seite ist, wie Sie das Kontext-Menü soll Aussehen wie für jede Zelle.
InformationsquelleAutor sharkyenergy | 2013-03-03
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Theres eine Stellvertretung für die! - Keine Notwendigkeit, Unterklasse
In IB, wenn Sie ziehen Sie eine
NSTableView
auf Ihre Fenster/- Ansicht werden Sie feststellen, dass theres einemenu
Steckdose für die Tabelle.Also eine sehr einfache Möglichkeit zur Implementierung der Kontext-Menü ist zu schließen, dass die Steckdose, um eine stub-Menü und schließen Sie die delegate-outlet im Menü, um ein Objekt implementiert die
NSMenuDelegate
- Protokoll-Methode- (void)menuNeedsUpdate:(NSMenu *)menu
Normalerweise die Stellvertretung für das Menü ist das gleiche Objekt, das die Datenquelle/Delegierten auf den Tisch, aber es könnte auch sein-view-controller besitzt, die die Tabelle zu.
Haben Sie einen Blick auf die docs für mehr info auf diesem
Gibt es ein Bündel von klugen Sachen, die Sie tun können, in das Protokoll, sondern eine sehr einfache Implementierung könnte wie folgt Aussehen
Und dann eine Methode zu konstruieren, das Menü.
Wie Sie sich entscheiden, zu implementieren
titleForRow:
undtitleForColumn:
ist bis zu Ihnen.Beachten Sie, dass
NSMenuItem
bietet die ImmobilierepresentedObject
zu erlauben, Sie zu binden, ein beliebiges Objekt, um den Menü-Element und damit das senden von Informationen in Ihre Methode (e.gdeleteObject:
)BEARBEITEN
Aufpassen - Umsetzung
- (void)menuNeedsUpdate:(NSMenu *)menu
in IhremNSDocument
Unterklasse wird halt der Autosave/Versions-Menü, das erscheint in der Titelleiste erscheint in 10.8.Es funktioniert immer noch in 10.7 so gehen Abbildung. In jedem Fall wird das Menü delegieren müssen, um etwas anderes als Ihre
NSDocument
Unterklasse.- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
und geben 0 zurück, wenn nötigEdit: Der bessere Weg, um dies zu tun, als die untenstehende Methode ist die Verwendung delegieren, wie gezeigt, in der akzeptierten Antwort.
Können Sie eine Unterklasse Ihr UITableView und implementieren
menuForEvent:
Methode:Das sollte es tun. Ich habe nicht versucht, den code obwohl. Aber dies sollte Ihnen eine Idee geben.
Ich habe auch versucht die Lösung gepostet von Warren Burton und es funktioniert gut.
Aber in meinem Fall hatte ich Folgendes hinzufügen, um das Menü Elemente:
Einstellung kein Ziel explizit bewirkt, dass das Kontextmenü deaktiviert bleiben.
Prost!
Alex
PS: hätte ich dies geschrieben, als Kommentar, aber ich habe nicht genug Ruf zu tun 🙁
Warren Burton's Antwort ist vor Ort auf. Für diejenigen, die in Swift, der folgende Beispiel-fragment könnte sparen Sie sich die Arbeit des übersetzens von Objective C. In meinem Fall war ich das hinzufügen von Kontextmenü-Zellen in einer NSOutlineView eher als eine NSTableView. In diesem Beispiel wird der Menü-Konstruktor sieht den Artikel und bietet verschiedene Optionen, je nach Element-Typ und Zustand. Die Delegierten (Satz in IB) ist ein ViewController verwaltet ein NSOutlineView.
Als TheGoonie erwähnt, ich habe auch die gleiche Erfahrung - Kontextmenü-Einträge waren, blieb deaktivieren. Aber der Grund für Elemente deaktiviert ist "Auto-Ermöglicht es, Items" - Eigenschaft.
Stellen Sie "Auto-Ermöglicht es, Items" - Eigenschaft auf off. oder legen Sie es programmgesteuert zu KEINE.
Hier ist ein Beispiel der Einrichtung einer NSOutlineView programmgesteuert innerhalb eines view-Controllers. Dies ist das Handwerk, die Sie benötigen, um das Kontext-Menü ausgeführt wird. Keine Unterklassen erforderlich.
Hatte ich vorher Unterklassen NSOutlineView überschreiben Menü(nur für Veranstaltung: NSEvent), aber kam, um ein einfacheres set-up mit Hilfe von Graham ' s Antwort hier und Warren Antwort oben.
Dies ist die einfachste Methode für eine benutzerdefinierte/dynamische
NSMenu
ich fand, , dass auch bewahrt das system Aussehen (blauer Auswahlrahmen). UnterklasseNSTableView
und stellen Sie Ihr Menü inmenu(for:)
.Der wichtigste Teil ist die legen Sie das Menü auf der Tabelle anzeigen, aber zum Menü zurückzukehren, aus der seine
super
nennen.