Frage

Ich habe eine Ansicht, die in jedem meines Collectionartikel verwendet wird. Ich habe eine IBOutlet zum CollectionViewItem aus meiner Sicht, und ich habe das im Interface Builder angeschlossen. Ich möchte einen Wert aus der representedObject zuzugreifen meiner Ansicht Code (das ist ein Core Data-Objekt ist). Hier ist ein Beispiel dafür, was ich versuche zu tun - eine Sequenz Wert des representedObject zuzugreifen:

In der H-Datei:

IBOutlet NSCollectionViewItem *item; // Connected in IB

In der .m-Datei

NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)

Ich weiß, dass die seq bevölkert ist, weil ich es auf ein Etikett in der CollectionViewItem Ansicht in IB mit dem representedObject.seq Schlüsselpfad binded habe und das funktioniert.

Jede Idee, warum, wenn ich versuche, für die Ansicht den Wert für seq in den Code für den Zugriff auf sie null zurückgibt?

War es hilfreich?

Lösung

Es ist sehr wahrscheinlich, dass NSCollectionViewItem nicht über IBOutlet Verbindungen von ihnen Elementen Blick auf den Prototyp NSCollectionViewItem kopiert. Daher item ist gleich Null, so seq auch gleich null.

Das typische Muster der NSCollectionViewItem Instanz für den Zugriff ist auf den Prototyp zu binden. Sie erwähnen, dass du das getan hast und dass es funktioniert. Das ist einfach, denn das ist die typische unterstützte Art und Weise tun.

Wenn Sie wirklich eine Verbindung direkt mit dem Element in einer Art und Weise müssen die Bindungen nicht zur Verfügung stellen kann, werden Sie wahrscheinlich auch manuell eingerichtet haben werden. Eine Möglichkeit, dies zu tun, ist NSCollectionViewItem die -copyWithZone: außer Kraft setzen, super nennt, dann stellen Sie die Verbindung manuell.

Andere Tipps

1) Unterklasse der NSView das für die Darstellung eines Elements in der Sammlung Ansicht verwendet wird

2) In dieser Unterklasse, fügen Sie einen Delegaten Eigenschaft

3) Sublcass die NSCollectionViewItem

4) Überschreiben Sie die setView: Methode. Eine Zeile der Delegierten-Eigenschaft der Ansicht auf die NSCollectionViewItem Instanz festgelegt (das heißt selbst).

Nun, innerhalb NSView Unterklasse, haben Sie Zugriff auf die entsprechenden NSCollectionView Artikel über den Delegaten Eigenschaft haben (zum Beispiel können Sie seine representedObject zugreifen).

Ich hatte das gleiche Problem, aber eine sehr einfache Lösung gefunden: Ich in einer anderen .xib die Ansicht setzen und verknüpfen diese in der NSCollectionViewItem (die eigentlich ein NSViewController ist). Dann wird die .xib für jede Zelle deserialisiert werden und alle Ausgänge gesetzt.

  1. Subclass NSView.
  2. Fügen Sie Delegatmethode zu der Unterklasse ... so etwas wie - (void)mouseDownOnItemAtIndex:(NSUInteger)index den Hörer zu sagen, dass der Benutzer auf ein Element in einem bestimmten Index angeklickt wird.
  3. Ziehen Sie die Sammlung Ansicht von self.superview in der gleichen Klasse. Erstellen Sie eine Variable ein NSUInteger zu speichern. Lagern Sie den Index des Elements durch die Methode [[collectionView subviews] indexOfObject:self] verwenden. Führen Sie diesen Index im Delegatmethode index Parameter.
  4. Die Klasse, die das Protokoll in Ihrem NSView nun von allen mousedown- Ereignissen an einer bestimmten Zelle zu hören, in der Lage, definiert entspricht. Wenn Sie die representedObject eines bestimmten Elements wollen, nur collectionView:itemAtIndex anrufen und das Element erhalten, indem sie über die representedObject Eigenschaft auf NSCollectionViewItem erreichbar.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top