Проблемы с NSTableView
-
06-07-2019 - |
Вопрос
Я работаю над изучением 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
создается первый экземпляр.
Другие советы
Во-первых, методы источника данных теперь имеют дело с NSInteger
s, не int
s.
Что еще более важно, если целью вашего развертывания является Mac OS X 10.6 или более поздней версии, то вам необходимо объявить класс вашего источника данных как соответствующий в NSTableViewDataSource
формальный протокол в вашем классе @interface
.(Этот протокол и многие другие являются новыми в версии 10.6;ранее это были неофициальные протоколы.)