Comment utiliser un NSArray et NSArrayController avec Core Data?
-
06-07-2019 - |
Question
J'ai du code qui doit accéder à un NSArray pour fonctionner. J'ai un NSArray que j'utilise avec Core Data et j'aurai des données, mais je ne sais pas comment faire en sorte que NSArrayController accède à NSArray.
Je ne peux pas simplement le déclarer dans le fichier d'en-tête comme suit: NSArray * objectArray;
car il ne sait ni comment ni à quel NSArray
accéder. Comment accéder exactement au NSArray que j’utilise avec Core Data?
Mon fichier d'en-tête:
#import <Cocoa/Cocoa.h>
@interface MyOutlineView : NSOutlineView {
NSArrayController* objectArray;
}
@end
Mon fichier d'implémentation:
#import "MyOutlineView.h"
@implementation MyOutlineView
- (void) outlineView: (NSOutlineView *) aView
willDisplayCell: (id) aCell
forTableColumn: (NSTableColumn *)aColumn
item: (id) anItem
{
id rootObj = anItem;
unsigned row = [aView rowForItem:anItem];
[aCell setDrawsBackground: YES];
while ([aView levelForRow:row] != 0) {
row --;
rootObj = [aView itemAtRow:row];
}
// The colours here are foul and ugly. Use something else, for
// God's sake!
if( [objectArray indexOfObject:rootObj] % 2 )
[aCell setBackgroundColor: [NSColor yellowColor]];
else
[aCell setBackgroundColor: [NSColor blueColor]];
}
@end
La solution
J'ai créé une application de test avec IBOutlet connecté à NSArrayController de Xib. Dans ce test, j'ai:
- a commencé à partir du modèle d'application Core Data;
- créé une entité dans un modèle de données avec deux attributs (string, int);
dans Xib:
- Contrôleur de matrice avec le contexte d'objet géré, connecté à Test_AppDelegate.managedObjectContext;
- TableView avec des colonnes connectées au premier et deuxième attribut d’objets arrangés du contrôleur de matrice;
- Boutons Ajouter et Supprimer, connectés à la commande add: and remove: actions du contrôleur de la matrice; Bouton
- "Afficher le nombre" et étiquette; -
dans le code (Test_AppDelegate. *):
- IBOutlet NSArrayController * ac; (connecté dans Xib de Test_AppDelegate.ac au contrôleur de tableau);
- IBOutlet NSTextField * nLabel; (connecté en Xib à Label);
- (IBAction) showNum: expéditeur (id); (connecté à partir du bouton "Afficher le nombre");
- code en action showNum: [nLabel setIntValue: [[ac ac rangedobjects] count]];
Je suis capable de:
- Ajouter / supprimer des objets à la vue tabulaire et au tableau contrôlé;
- Accédez à NSArrayController à partir du code pour obtenir le tableau arrayObjects.
Ainsi, lier IBOutlet du code au contrôleur multidisque de Xib et accéder à ses organigrammes arrangés devrait fonctionner.
Autres conseils
Je ne comprends peut-être pas cela, mais vous ne pouvez pas simplement créer une méthode initWithArray?