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