Проблемы с NSTableView - PullRequest
       20

Проблемы с NSTableView

2 голосов
/ 13 сентября 2009

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

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, если это что-то меняет. Заранее спасибо.

Ответы [ 2 ]

8 голосов
/ 13 сентября 2009

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

Что более важно, если целью развертывания является Mac OS X 10.6 или более поздняя версия, вам необходимо объявить класс источника данных как соответствующий NSTableViewDataSource формальному протоколу класс @interface. (Этот протокол и многие другие являются новыми в 10.6; ранее они были неофициальными протоколами.)

6 голосов
/ 13 сентября 2009

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

@interface RobotManager : NSObject <NSTableViewDataSource> {

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

Edit:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...