Pregunta

Estoy trabajando en el aprendizaje de Objective-C / Coaoa, pero parece que me he quedado un poco atascado para que el objeto NSTableView funcione para mí. He seguido todas las instrucciones, pero por alguna razón sigo recibiendo este error:

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

Aquí está mi fuente, dime qué ves que está mal aquí, estoy a punto de arrancarme la cara.

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

Estoy ejecutando OS X 10.6.1 si eso hace alguna diferencia. Gracias de antemano.

¿Fue útil?

Solución

Intente cambiar la declaración de @interface a lo siguiente:

@interface RobotManager : NSObject <NSTableViewDataSource> {

Esto le indicará al compilador que la clase RobotManager sigue el protocolo NSTableViewDataSource .

Edición :

Además, es probable que RobotList no se inicialice antes de que se invoquen los dos métodos de NSTableViewDataSource . En otras palabras, no se llama a awakeFromNib .

A menos que haya una llamada explícita al awakeFromNib de alguna persona que llama, la RobotList no se inicializará, por lo que en lugar de completar la RobotList en ese método, intente rellenarlo cuando el RobotManager se instancia por primera vez.

Otros consejos

Por un lado, los métodos de fuente de datos ahora tratan con NSInteger s, no con int s.

Más relevante aún, si su objetivo de implementación es Mac OS X 10.6 o posterior, debe declarar que la clase de su fuente de datos cumple con el NSTableViewDataSource formal protocolo en el @interface . (Este protocolo y muchos otros son nuevos en 10.6; anteriormente, eran protocolos informales).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top