#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];
, и теперь он отлично работает. Спасибо всем!