3

dans Xcode 3.1.2 Je chargeais la pointe du NSCollectionViewItem dans ma sous-classe de NSCollectionViewItem comme ceci:NSCollectionView à 10,6/Xcode 3.2

-(id)copyWithZone:(NSZone *)zone 
{ 
    id result = [super copyWithZone:zone]; 

    [NSBundle loadNibNamed:@"PersonView" owner:result]; 

    return result; 
} 

Dans Xcode 3.2 sous 10.6 la même méthode ne donne pas à une erreur, mais il ne charge pas la vue dans le NSCollectionView non plus.

Y at-il autre chose à faire pour que la vue apparaisse? Ou y a-t-il même une meilleure façon de faire cela qui vient avec le changement de la superclasse de NSCollectionItem à NSViewController? Après tout, l'annulation de copyWithZone pour obtenir cette fonctionnalité standard m'a toujours semblé un hack. Je pense qu'on devrait pouvoir spécifier la plume qui est censée être utilisée dans IB, mais il semble que Apple ne le pense pas.

J'ai regardé l'exemple qui est disponible dans la documentation, mais le NSCollectionViewItem est instancié par programmation en utilisant initWithNibName, mais je voudrais le créer dans l'IB.

MISE À JOUR:

Je l'ai fait ce que kperryua suggéré, mais maintenant je ne peux pas accéder à sorties du NSCollectionViewItem. Voici ce que je suis en train de faire:

- (void)setRepresentedObject:(id)object { 

    if (object) { 
     [labelName setValue:[object name]]; 
    } 
} 

Je binded le nom de l'étiquette au propriétaire du fichier qui est mon NSCollectionViewItem. Cela fonctionnait parfaitement dans 10.5, mais maintenant la sortie n'est pas assignée (j'ai vérifié cela avec GDB).

image showing the bindings http://img21.imageshack.us/img21/671/picya.png

MISE À JOUR 2:

J'ai aussi binded itemPrototype du NSCollectionView à ma sous-classe de NSCollectionViewItem (PersonController).

image showing bindings http://img503.imageshack.us/img503/4672/pic2d.png

Maintenant, à la fois la File's Owner du PersonView.nib et itemPrototype du point NSCollectionView à ma sous-classe.

image showing console output http://img340.imageshack.us/img340/6184/pic3.png

Comme vous pouvez le voir dans la capture d'écran l'élément sont affichés, mais le texte de l'étiquette ne peut être modifiée que la sortie labelName est pas accessible.

J'ai également enregistré le nom que j'essaie de définir pour m'assurer qu'il ne s'agit pas de 'Name'.

Que faut-il faire pour changer la valeur de l'étiquette?

Toute aide serait appréciée.

Répondre

4

Oui, Snow Leopard vous facilite grandement la tâche. Dans IB, cliquez sur NSCollectionViewItem et définissez le nom de la plume et le nom de l'ensemble (laissez-le vide pour l'ensemble principal). Dans votre nib PersonView, rendez le NSCollectionViewItem propriétaire du fichier et connectez la sortie -view à une vue dans cette plume.(Il semblerait que vous ayez déjà configuré ceci comme cela dans cette plume.) Tout le reste devrait être automatique, et surcharger copyWithZone: ne devrait pas être nécessaire.

+0

Merci. Il apparaît maintenant, mais je ne peux pas accéder aux prises auxquelles j'ai lié le FileOwner de la plume qui contient la vue de l'objet. Dois-je faire différemment maintenant? –

+0

Je ne suis pas sûr de ce que vous voulez dire. Peux-tu élaborer? – kperryua

+0

J'ai édité ma réponse pour vous montrer ce que je veux dire. –

0

Pour synchroniser la propriété du representedObject avec la valeur d'un élément IB, vous pouvez utiliser les liaisons Cocoa. Lier la valeur de la TextField à la Chemin de clé du modèlerepresentedObject.namePropriétaire du fichier dans ce cas.

Je l'ai eu qui fonctionne avec 10.6 Xcode 3.2 mais ce qui ne fonctionne pas est ce que vous avez fait: Connexion d'un élément IB à un point de vente de mon CollectionViewItem. J'ai une sous-classe personnalisée de CollectionViewItem et tout ce que vous avez configuré. Mais lors de l'exécution de l'application, il échoue en indiquant

[NSTextField copyWithZone]: sélecteur non reconnu envoyé à l'instance 0x210a60 2009-10-19 13: 05: 18,772 WrapperTest [24122: a0f] Une exception non détectée a été soulevée 2009-10-19 13: 05: 18.774 WrapperTest [24122: a0f] - [NSTextField copyWithZone:]: sélecteur non reconnu envoyé à l'instance 0x210a60 2009-10-19 13: 05: 18.779 WrapperTest [24122: a0f] *** Fin de la session application due à l'exception non interceptée 'NSInvalidArgumentException', raison: '- [NSTextField copyWithZone:]: sélecteur non reconnu envoyé à l'instance 0x210a60' *** Pile d'appel au premier lancement: ( 0 CoreFound ation 0x977f658a __raiseError + 410 1 libobjc.A.dylib 0x9767ff49 objc_exception_throw + 56 2 CoreFoundation 0x978429db - [NSObject (NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x9779e026 ___forwarding___ + 950 4 CoreFoundation 0x9779dbf2 _CF_forwarding_prep_0 + 50 5 CoreFoundation 0x97789a5a - [NSObject (NSObject) copie] + 42 6 AppKit 0x918ce1d7 - [NSViewController setTitle:] + 70 7 AppKit 0x91167dab - [NSNibOutletConnector etablitConnexionQ] + 406 ...

Je ne sais pas pourquoi les NSTextFields sont manquant leur copyWithZone car ils devraient l'implémenter

J'ai fixé cela, je n'étais pas au courant, que j'avais besoin de déclarer ces prises en tant que propriétés de la vue, tout y compris les liaisons semblent fonctionner.