Проблемы с NSTableView

#objective-c #cocoa #macos #nstableview

#цель-c #какао #macos #nstableview #objective-c #cocoa

Вопрос:

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

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

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

RobotManager.h

@интерфейс RobotManager : NSObject {
 // Переменные интерфейса
 IBOutlet NSWindow * Главное окно;
 IBOutlet NSTableView * Таблица роботов;
 NSMutableArray * Список роботов;
}

- (int) numberOfRowsInTableView: (NSTableView *) Просмотр таблицы;
- (идентификатор) TableView: (NSTableView *) TableView objectValueForTableColumn: (NSTableColumn *)строка столбца таблицы: (int)RowIndex;
@end

RobotManager.m

#импортировать "RobotManager.h"

@внедрение RobotManager

-(недействительный) awakeFromNib {
 // Сгенерировать несколько фиктивных значений
 [Добавить объект в список роботов:@"Привет"];
 [Добавить объект в список роботов:@"World"];
 [RobotTable setDataSource:self]; // Здесь я получаю предупреждение протокола
 [Повторная загрузка таблицы роботов];
}

-(int) numberOfRowsInTableView: (NSTableView *) Просмотр таблицы {
 возврат [количество списков роботов];
}

-(идентификатор) TableView:(NSTableView *) TableView objectValueForTableColumn:(NSTableColumn *)строка столбца таблицы: (int)RowIndex { 
 возвращает [RobotList objectAtIndex:RowIndex]объект списка роботов;
}

@end

Я использую OS X 10.6.1, если это имеет какое-то значение. Заранее благодарю.

Ответ №1:

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

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

Ответ №2:

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

 @interface RobotManager : NSObject <NSTableViewDataSource> {
  

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

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

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

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

Комментарии:

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

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

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