Вопрос

Я работаю над изучением 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, если это имеет какое-то значение.Заранее благодарю.

Это было полезно?

Решение

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

@interface RobotManager : NSObject <NSTableViewDataSource> {

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

Редактировать:

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

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

Другие советы

Во-первых, методы источника данных теперь имеют дело с NSIntegers, не ints.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top