NSTableView Troubles
-
06-07-2019 - |
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.
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.)