2009-09-12 3 views
2

Я работаю над обучением Objective-C/Coaoa, но, похоже, я немного застрял в том, чтобы заставить объект NSTableView работать для меня. Я следовал всем инструкциям, но по какой-то причине я все еще получаю эту ошибку:NSTableView Troubles

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

Вот мой источник, скажите мне, что вы видите здесь не так, я о том, чтобы оторвать лицо.

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 

Я бегу OS X 10.6.1, если это делает никакой разницы. Заранее спасибо.

ответ

6

Попробуйте изменить декларацию @interface к следующему:

@interface RobotManager : NSObject <NSTableViewDataSource> { 

Это говорит компилятору, что RobotManager класс следует протоколу NSTableViewDataSource.

Edit:

Кроме того, это, вероятно, вероятно, что RobotList не инициализируется перед тем в настоящее время называют два метода NSTableViewDataSource. Другими словами, awakeFromNib не вызывается.

Если нет явного вызова к awakeFromNib от некоторого вызывающего абонента, то RobotList не будет инициализирован, так что вместо заполнения RobotList в этом методе, попробуйте заселять его, когда RobotManager сначала экземпляр.

+0

Это избавило от предупреждения, но данные все еще не отображаются в NSTableView. –

+0

Nakedsteve: Вы не создали массив и поместили его в переменную 'RobotList'. Эта переменная содержит 'nil'. Таким образом, вы отправляете сообщения 'addObject:' в 'nil', что ничего не делает и запрашивает счетчик' nil', который возвращает 0. –

+0

Да, это так. Я добавил 'RobotList = [[NSMutableArray alloc] init];' и теперь он отлично работает. Всем спасибо! –

8

С одной стороны, методы источника данных теперь имеют дело с NSInteger s, а не int.

Более того, если целью развертывания является Mac OS X 10.6 или новее, тогда вам необходимо объявить класс источника данных как соответствующий the NSTableViewDataSourceformal protocol ввашего класса. (Этот протокол и многие другие являются новыми в 10.6, ранее они были неофициальные протоколы.)