Question

Je travaille sur Objective-C / Coaoa, mais il semble que je sois un peu coincé pour que l’objet NSTableView fonctionne pour moi. J'ai suivi toutes les instructions, mais pour une raison quelconque, j'obtiens toujours l'erreur suivante:

Class 'RobotManager' does not implement the 'NSTableViewDataSource' protocol

Voici ma source, dites-moi ce que vous voyez comme étant faux ici, je suis sur le point de m'arracher le visage.

RobotManager.h

@interface RobotManager : NSObject {
 // Interface vars
 IBOutlet NSWindow *MainWindow;
 IBOutlet NSTableView *RobotTable;
 NSMutableArray *RobotList;
}

- (int) numberOfRowsInTableView: (NSTableView*) tableView;
- (id) tableView:(NSTableView *) tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex;
@end

RobotManager.m

#import "RobotManager.h"

@implementation RobotManager

-(void) awakeFromNib {
 // Generate some dummy vals
 [RobotList addObject:@"Hello"];
 [RobotList addObject:@"World"];
 [RobotTable setDataSource:self]; // This is where I'm getting the protocol warning
 [RobotTable reloadData];
}

-(int) numberOfRowsInTableView: (NSTableView *) tableView {
 return [RobotList count];
}

-(id) tableView:(NSTableView *) tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex {
 return [RobotList objectAtIndex:rowIndex];
}

@end

J'utilise OS X 10.6.1 si cela change quelque chose. Merci d'avance.

Était-ce utile?

La solution

Essayez de remplacer la déclaration de @interface par la suivante:

@interface RobotManager : NSObject <NSTableViewDataSource> {

Ceci indiquera au compilateur que la classe RobotManager suit le protocole NSTableViewDataSource .

Modifier:

De plus, il est probable que RobotList ne soit pas initialisé avant que les deux méthodes de NSTableViewDataSource ne soient appelées. En d'autres termes, awakeFromNib n'est pas appelé.

Sauf appel explicite au awakeFromNib d'un appelant, la RobotList ne sera pas initialisée. Par conséquent, plutôt que de renseigner la RobotList dans cette méthode, essayez de la renseigner lorsque le RobotManager est instancié pour la première fois.

Autres conseils

D'une part, les méthodes de source de données traitent maintenant avec des NSInteger , et non des int s.

Plus précisément, si votre cible de déploiement est Mac OS X 10.6 ou une version ultérieure, vous devez déclarer la classe de votre source de données conforme à le protocole NSTableViewDataSource formel dans le @interface de votre classe . (Ce protocole et de nombreux autres sont nouveaux dans la version 10.6; ils étaient auparavant des protocoles informels.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top