Domanda

Sto lavorando per imparare Objective-C / Coaoa, ma mi sembra di essermi un po 'bloccato nel far funzionare l'oggetto NSTableView per me. Ho seguito tutte le indicazioni, ma per qualche motivo ho ancora questo errore:

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

Ecco la mia fonte, dimmi cosa vedi che non va qui, sto per strapparmi la faccia.

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

Sto eseguendo OS X 10.6.1 se questo fa alcuna differenza. Grazie in anticipo.

È stato utile?

Soluzione

Prova a cambiare la dichiarazione del @interface nel modo seguente:

@interface RobotManager : NSObject <NSTableViewDataSource> {

Questo dirà al compilatore che la classe RobotManager segue il protocollo NSTableViewDataSource .

Modifica

Inoltre, è probabile che RobotList non venga inizializzato prima che vengano chiamati i due metodi di NSTableViewDataSource . In altre parole, awakeFromNib non viene chiamato.

A meno che non vi sia una chiamata esplicita al awakeFromNib da parte di alcuni chiamanti, il RobotList non verrà inizializzato, quindi piuttosto che popolare il RobotList in quel metodo, prova a compilarlo quando viene istanziato RobotManager .

Altri suggerimenti

Per prima cosa, i metodi dell'origine dati ora gestiscono i NSInteger , non i int .

Più pertinentemente, se la destinazione di distribuzione è Mac OS X 10.6 o successive, è necessario dichiarare la classe dell'origine dati conforme a il NSTableViewDataSource formale protocollo nel @interface . (Questo protocollo e molti altri sono nuovi in ??10.6; in precedenza erano protocolli informali.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top