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