Question

J'ai une vue qui obtient utilisé dans chacun des articles de mon CollectionView. J'ai un IBOutlet au CollectionViewItem de mon avis et j'ai accroché que dans Interface Builder. Je veux accéder à une valeur de la representedObject (qui est un objet de données de base) dans mon code de vue. Voici un exemple de ce que je suis en train de faire - accéder à une valeur de séquence du representedObject:

Dans le fichier .h:

IBOutlet NSCollectionViewItem *item; // Connected in IB

Dans le fichier .m

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

Je sais que seq est peuplé parce que je l'ai binded à une étiquette dans la vue en CollectionViewItem IB en utilisant le chemin representedObject.seq clé et qui fonctionne.

Toute idée pourquoi quand je tente d'accéder à la valeur suivants du code de la vue, il renvoie null?

Était-ce utile?

La solution

Il est très probable que NSCollectionViewItem ne copie pas sur les connexions IBOutlet de leur point de vue de l'objet au prototype NSCollectionViewItem. Par conséquent, item est nul, donc seq sera également nulle.

Le schéma typique pour accéder à l'instance NSCollectionViewItem est de se lier au prototype. Vous mentionnez que vous avez fait cela et que cela fonctionne. C'est tout simplement parce que c'est la façon typique, prise en charge de le faire.

Si vous avez vraiment besoin d'une connexion directement à l'élément d'une manière qui ne peuvent pas fournir des liaisons, vous aurez probablement de le configurer manuellement. Une façon de le faire est de passer outre la -copyWithZone: NSCollectionViewItem, appelez super, effectuez la connexion manuellement.

Autres conseils

1) Sous-classe la NSView qui est utilisé pour le rendu d'un élément dans la vue de la collection

2) Dans la présente sous-classe, ajouter une propriété déléguée

3) Sublcass la NSCollectionViewItem

4) Remplacer la setView: méthode. Ajouter une ligne pour définir la propriété de délégué de la vue de l'instance NSCollectionViewItem (à savoir l'auto).

, dans la sous-classe NSView, vous aurez accès à l'élément correspondant NSCollectionView via la propriété de délégué (par exemple, vous pouvez accéder à son representedObject).

J'ai eu le même problème, mais trouvé une solution très simple: je mets la vue dans un autre .xib et Linked cela dans le NSCollectionViewItem (qui est en fait un NSViewController). Ensuite, la .xib sera désérialisée pour chaque cellule et tous les points sont réglés.

  1. Sous-classe NSView.
  2. Ajouter méthode déléguée à ladite sous-classe ... quelque chose comme - (void)mouseDownOnItemAtIndex:(NSUInteger)index pour dire à l'auditeur que l'utilisateur a cliqué sur un élément à un index spécifique.
  3. Tirez la vue de collection en utilisant self.superview dans la même classe. Créer une variable pour stocker une NSUInteger. Stocker l'index de l'élément en utilisant la méthode [[collectionView subviews] indexOfObject:self]. Passer cet indice dans le paramètre de procédé délégué index.
  4. La classe qui est conforme au protocole défini dans votre NSView sera désormais en mesure d'entendre des événements MouseDown à une cellule spécifique. Si vous voulez que le representedObject d'un élément spécifique, il suffit d'appeler collectionView:itemAtIndex et obtenir l'élément en y accédant via la propriété representedObject sur NSCollectionViewItem.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top