NSCollectionView ne dessine rien
Question
Je suis en train de mettre en place un NSCollectionView
(je l'ai fait avec succès dans le passé, mais pour une raison quelconque, il échoue cette fois).
J'ai une classe de modèle appelé « TestModel », et il a une propriété NSString
qui vient retourne une chaîne (uniquement à des fins de test en ce moment). J'ai alors une déclaration de propriété NSMutableArray
dans ma classe principale délégué de l'application, et ce tableau ajouter des instances de l'objet TestModel
.
J'ai alors un contrôleur RAID qui a son tableau de contenu lié le NSMutableArray
du délégué de l'application. Je peux confirmer que tout jusqu'ici fonctionne très bien; NSLogging:
[[[arrayController arrangedObjects] objectAtIndex:0] teststring]
a bien fonctionné.
J'ai ensuite toutes les liaisons appropriées pour la vue de collecte mis en place, (itemPrototype et contenu), et pour la collection Voir article (vue). J'ai alors un champ de texte dans la vue de l'élément de collection qui est lié à la collection Voir Item.representedObject.teststring
. Cependant rien affiche dans la vue de collection quand je commence l'application, juste un écran blanc. Qu'est-ce que je manque?
Mise à jour: Voici le code que j'utilise (demandé par Wil Shipley):
// App delegate class
@interface AppController : NSObject {
NSMutableArray *objectArray;
}
@property (readwrite, retain) NSMutableArray *objectArray;
@end
@implementation AppController
@synthesize objectArray;
- (id)init
{
if (self = [super init]) {
objectArray = [[NSMutableArray alloc] init];
}
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
TestModel *test = [[[TestModel alloc] initWithString:@"somerandomstring"] autorelease];
if (test) [objectArray addObject:test];
}
@end
// The model class (TestModel)
@interface TestModel : NSObject {
NSString *teststring;
}
@property (readwrite, retain) NSString *teststring;
- (id)initWithString:(NSString*)customString;
@end
@implementation TestModel
@synthesize teststring;
- (id)initWithString:(NSString*)customString
{
[self setTeststring:customString];
}
- (void)dealloc
{
[teststring release];
}
@end
Et puis comme je l'ai dit le tableau contenu du contrôleur Array est lié à cette « objectArray », et le contenu du NSCollectionView est lié à Controller.arrangedObjects Array. Je peux vérifier que le contrôleur RAID les objets par NSLogging [arrayController arrangedObjects], et il retourne l'objet correct. Il est juste que rien n'affiche dans le NSCollectionView.
Mise à jour 2: Si je me connecte [contenu CollectionView] Je ne reçois rien:
2009-10-21 08:02:42.385 CollViewTest[743:a0f] (
)
Le problème est probablement là.
Mise à jour 3: Comme l'a demandé ici est le projet Xcode:
http://www.mediafire.com/?mjgdzgjjfzw
L'une application menubar, donc il n'a pas de fenêtre. Lorsque vous construisez et exécutez l'application, vous verrez un élément MenuBar qui dit « test », ce qui ouvre la vue qui contient le NSCollectionView.
Merci
La solution
Le problème est que vous n'êtes pas correctement en utilisant KVC. Il y a deux choses que vous pouvez faire.
Méthode 1: simple mais pas si élégant
- Utilisez le code suivant pour ajouter l'objet au tableau
[[self mutableArrayValueForKey: @ "objectArray"] addObject: Test];
Ce n'est pas si élégante que vous devez spécifier la variable à l'aide d'une valeur de chaîne, de sorte que vous n'obtenir des avertissements du compilateur lorsque orthographié de manière incorrecte.
Méthode 2: Générer les méthodes KVO nécessaires pour le tableau "objectArray"
.- Sélectionnez la propriété dans votre déclaration d'interface
- Sélectionnez Scripts (l'icône de script dans la barre de menus)> Code de> Lieu decls accesseurs sur Presse-papiers
- Coller les déclarations dans la endroit approprié dans votre fichier d'interface
- Sélectionnez Scripts> code> Lieu defs accesseurs sur Presse-papiers
- Coller les définitions contenues dans la endroit approprié dans votre fichier d'implémentation
Vous pouvez ensuite utiliser une méthode qui ressemble à
[self insertObject:test inObjectArrayAtIndex:0];