2009-06-22 9 views
2

Ich versuche, einen Datei-Explorer mit nscollectionview zu erstellen und implementiere derzeit ein Kontextmenü für jeden Eintrag (d. H. Kopieren/löschen/umbenennen/etc). Ich habe zur Zeit:NSArrayController-Element für Rechtsklick in NSCollectionView abrufen

  • Ein NSCollectionView mit einem NSArrayController verknüpft, die eine für jedes Element
  • Eine Unterklasse von NSBox als Ansichtsobjekt benutzerdefinierten hält, diese Spuren auch Mausereignisse und übergibt sie an die Steuerung
  • Der Controller verfügt über einen NSMenu Auslass (rcMenu) und auch ein NSView Auslass (itemView) für die NSBox Unterklasse, die, wo das Menü Popup
  • der Code für den Aufruf des Menüs ist sein sollte:

    [NSMenu popUpContextMenu: rc Menü withEvent: Ereignis fürView: itemView];

Einmal ausgeführt, das funktioniert, dass das Menü erscheint, wenn rechts das Element in der Sammlung Ansicht klicken, sondern das Ereignis auf Inspektion, die an die Steuerung übergeben wird, dann ist es nicht wirklich alles, was ich, um herauszufinden, verwenden könnte die Das Objekt wurde mit der rechten Maustaste angeklickt, mit Ausnahme der x, y-Koordinaten (die eher für NSWindow als für das Element oder NSCollectionView zu sein scheinen). Was ich wirklich will, ist das Objekt im NSArrayController, auf das man mit der rechten Maustaste geklickt hat.

Liegt es daran, dass ich es falsch einrichte, gibt es einen einfachen Weg, um es herauszufinden, oder ist es nur so schwierig, es auszuarbeiten?

Antwort

2

Sie könnten versuchen, das Menü für die Ansicht der einzelnen Sammlungsansichtselemente festzulegen. Höchstwahrscheinlich werden Sie dies tun, indem Sie in Ihrer Objektsichtklasse +defaultMenu überschreiben. Sobald Sie das tun, kommentieren Sie die popUpContextMenu:withEvent:forView: Nachricht aus und sehen Sie, ob Sie ohne es wegkommen können.

Darüber hinaus wäre es dann nicht zu schwer, verschiedene Menüs für verschiedene Arten von Elementen (z. B. Ordner vs. Pakete vs. Dateien und verschiedene Dateitypen) zu bedienen. Sie müssten wahrscheinlich -menuForEvent: anstelle von +defaultMenu überschreiben.

+0

Wird die Methode des Menüs des Erhaltens meine Fähigkeit beeinflussen das Element aus dem Array-Controller zu erhalten, obwohl ? Das ist das eigentliche Problem, das ich habe. Für was es wert ist, versuchte ich das defaultMenu und das funktionierte, hatte aber Probleme zu versuchen, menuForEvent, um rcMenu zurückzugeben, obwohl es eine durch Code erstellt fein zurückgegeben. – Septih

+0

"Holen Sie den Artikel vom Array-Controller"? Sie werden bereits wissen, auf welches dargestellte Objekt der Benutzer geklickt hat, durch welche Objektansicht sie geklickt haben, vorausgesetzt, Sie haben einen Verweis von Ihrer Objektansicht zurück auf entweder das Objekt der Sammlungsansicht oder das dargestellte Objekt. –

+0

Ich denke, das ist das Problem, ich kann nicht herausfinden, wie man diese Referenz zwischen der Artikelansicht und dem tatsächlichen Objekt/dargestellten Objekt erhalten kann. – Septih

1

Ich fand eine andere Lösung, die helfen könnte.

Für diese Lösung habe ich eine Unterklasse von NSCollectionViewItem bzw. NSView erstellt (und zur Vereinfachung der Erklärung) ItemViewController und ItemView.

Ich gehe davon aus, dass Sie mit IB arbeiten, wo Sie Ihre NSCollectionView bereits an das ContentArray Ihres NSArrayControllers gebunden haben (binden Sie auch die selectionIndexes).

Fügen Sie als Nächstes ein ViewController-Objekt zur NIB hinzu, und stellen Sie sicher, dass die benutzerdefinierte Klasse auf ItemViewController festgelegt ist. Verbinden Sie es nun mit dem ItemPrototype-Ausgang Ihrer NSCollectionView.

Fügen Sie als Nächstes ein benutzerdefiniertes Ansichtsobjekt zur NIB hinzu, und legen Sie die benutzerdefinierte Klasse auf ItemView fest. Verbinden Sie die Steckdose mit der View-Eigenschaft Ihres ItemViewController.

In der Schnittstellendatei von ItemView erstellen Sie eine repretObject-ähnliche Eigenschaft. Mit diesem meine ich etwas wie:

@property (nonatomic, assign) id someRepresentedObjectPropertyName 

Dies wird die Eigenschaft, die das Element in Ihrem NSArrayController darstellen wird. Gehen Sie nun zur Implementierungsdatei von ItemViewController und überschreiben Sie die -setRepresentedObject: Methode. Hier werden wir zuerst das ItemViewController -Handle setzen, das sein reprodedObject setzt, danach weisen wir dasselbe reprotectedObject der Eigenschaft zu, die wir in ItemView gemacht haben. Die Überschreibung würde wie folgt aussehen:

-(void)setRepresentedObject:(id)representedObject { 
    [super setRepresentedObject:representedObject]; 

    //Do some appropiate checking on the representedObject... 

    if (self.view != nil) { 
     [(ItemView *)self.view setSomeRepresentedObjectPropertyName:self.representedObject]; 
    } 
} 

Nun, wenn Sie auf die Umsetzung der ItemView zurückgehen können Sie die Methode außer Kraft setzen -rightMouseUp: und bauen/Set-up ein NSMenu dort und verwenden Sie die -popUpMenuPositioning...: Methode. Die someRepresentedObjectPropertyName Eigenschaft von ItemView sollte auf das richtige Element in Ihrem NSArrayController festgelegt werden.

EDIT:

Statt des überwiegenden -setRepresentedObject könnten Sie auch die ItemView binden ‚s someRepresentedObjectPropertyName-representedObject.someRepresentedObjectPropertyName

+1

Sie könnten einen Teil mit dem Überschreiben von 'setRepresentObject' umgehen, indem Sie Bindings aus dem Code verwenden (ich meine den' SomeReprenededObjectPropertyName' von bind view zu 'represencedObject.someReprenededObjectPropertyName') – asdf

+1

Ich stimme zu, Sie könnten den override-part mit Bindings vermeiden. Ich werde meine Antwort mit Ihrem Vorschlag aktualisieren –

Verwandte Themen