Работа с находящимися в NSCell табличными представлениями

Несмотря на то, что большинство таблиц использует NSView подклассы для ячеек, Вы, возможно, должны были бы работать с вместо этого использующей таблицей NSCell подклассы. Работа с NSCell- основанная таблица подобна работе с NSView- основанная таблица, но существуют различия в том, как Вы добавляете ячейки к таблице и как Вы используете привязку Какао.

Составление находящейся в NSCell таблицы в интерфейсном разработчике

Шаги Вы берете для создания NSCell- основанная таблица в Интерфейсном Разработчике идентична шагам, которые Вы предпринимаете для создания NSView- основанная таблица. Для специфических особенностей посмотрите Построение Табличного представления Используя Интерфейсного Разработчика.

После добавления NSCell- основанная таблица к Вашему пользовательскому интерфейсу, можно добавить отдельные ячейки или вручную или использующий Интерфейсного Разработчика. Использовать Интерфейсного Разработчика для добавления ячеек:

  1. Перетащите корректный тип ячейки от библиотеки объектов до надлежащего столбца в табличном представлении.

    Только подклассы NSCell может быть вставлен в NSCell- основанные табличные представления.

  2. Повторяйте шаг 1 так же часто по мере необходимости для обеспечения ячеек для каждого столбца.

  3. Рассмотрите установку идентификатора для каждого столбца. Установите идентификатор в области Identity инспектора Идентификационных данных.

    Установка идентификатора столбца делает заполнение и получение столбцов существенно проще.

Роль объекта источника данных табличного представления

NSCell- основанные табличные представления подобны NSView- основанные табличные представления: у Них есть источник данных, принимающий NSTableViewDataSource протокол и дополнительный делегат, принимающий NSTableViewDelegate Protocol позволить custome поведение табличного представления.

Сказать табличное представление, сколько строк это должно вывести на экран, NSCell- основанные табличные представления должны реализовать numberOfRowsInTableView:NSTableViewDataSource метод. Это должно также реализовать tableView:objectValueForTableColumn:row: метод, возвращающий данные, выведенные на экран в каждой ячейке столбца. Если данные табличного представления доступны для редактирования, то метод для разрешения обновления значений модели может быть реализован. Обратите внимание на то, что при использовании привязки Какао для заполнения NSCell- основанное табличное представление, методы источника данных, требуемые для программируемого заполнения, является ненужным.

Класс табличного представления, соответствующий протоколу источника данных, ответственен за:

Несмотря на то, что NSTableViewDelegate Protocol объявляет, что все обеспечивающие данные методы являются дополнительными, все программно заполняющие источники данных, NSCell- основанные табличные представления должны реализовать те методы. Методы, обеспечивающие число строк и содержания для каждого элемента в таблице, являются дополнительными при использовании привязки Какао.

Если Ваше приложение использует источник данных, класс источника данных должен принять NSTableViewDataSource протокол и реализация некоторые или все методы определяются протоколом. Даже при том, что все методы в источнике данных являются дополнительными, numberOfRowsInTableView: если Вы не используете привязку Какао, метод не является дополнительным.

Предоставление данных табличному представлению программно

Для заполнения табличного представления программно используйте этот процесс:

Заполнение демонстрационной таблицы

Следующий пример заполняет простое табличное представление и позволяет редактировать. Таблица состоит из отдельного столбца под названием «Имена».

Столбцу таблицы установили его идентификатор столбца в name. Это может быть сделано в Интерфейсном Разработчике путем выбора столбца таблицы, открытия инспектора Атрибутов Столбца таблицы и установки строки идентификатора. Это может также быть сделано программно путем вызова setIdentifier: на столбце таблицы, передавая имя столбца. Идентификатор столбца таблицы является большим удобством при использовании NSCell- основанные табличные представления с многократными столбцами (и это - абсолютная необходимость при использовании NSView- основанные табличные представления). Для доступа к экземпляру столбца таблицы просто попросите у табличного представления столбца при помощи строки идентификатора. Таким образом Вы избавляете от необходимости кэшировать столбцы таблицы для сравнения. Установка идентификатора столбца является простой практикой, которую необходимо всегда выполнять.

Фрагмент кода в Перечислении 8-1 показывает реализацию numberOfRowsInTableView: метод источника данных. Для этого простого фрагмента кода предполагается, что делегат приложения действует как объект источника данных табличного представления и что демонстрационные данные являются простым массивом строк, сохраненных в свойстве, объявленном как namesArray.

  Пример перечисления 8-1 numberOfRowsInTableView: реализация

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
    // This is a defensive move
    // There are cases where the nib containing the NSTableView can be loaded before the data is populated
    // by ensuring the count value is 0 and checking to see if the namesArray is not nil, the app
    // is protecting itself agains that situation
    NSInteger count=0;
    if (self.namesArray)
        count=[self.namesArray count];
    return count;
}

numberOfRowsInTableView: реализация возвращает число объектов в namesArray. Сначала это делает некоторое безопасное программирование. Это объявляет a count переменная и наборы это к 0 и затем гарантирует это self.namesArray не nil. Это - хорошая практика, потому что иногда NIB, содержащий табличное представление, может быть загружен и отправлен a reload сообщение перед самими данными было инициализировано. Поскольку этот метод возвращает скаляр, исключение может произойти. Путем выполнения этого простого теста приложение может гарантировать, что данные были загружены и доступны, прежде чем любая попытка будет предпринята для отображения содержания.

Реализовав метод, возвращающий число элементов в табличном представлении, необходимо теперь реализовать метод, заполняющий те строки. tableView:objectValueForTableColumn:row: метод возвращает надлежащее значение для отображения для требуемой строки и столбца указанного NSTableView. Вы видите в Перечислении 8-2 пример того, почему идентификатор столбца таблицы так полезен: идентификационные данные столбца, требующего населения, отправляются identifier обменивайтесь сообщениями и имя возвратилось, сравнен для определения данных для обеспечения.

  Пример перечисления 8-2 tableView:objectValueForTableColumn:row: демонстрационная реализация

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
    // The return value is typed as (id) because it will return a string in most cases.
    id returnValue=nil;
 
    // The column identifier string is the easiest way to identify a table column.
    NSString *columnIdentifer = [aTableColumn identifier];
 
    // Get the name at the specified row in namesArray
    NSString *theName = [namesArray objectAtIndex:rowIndex];
 
 
    // Compare each column identifier and set the return value to
    // the Person field value appropriate for the column.
    if ([columnIdentifer isEqualToString:@"name"]) {
        returnValue = theName;
    }
 
 
    return returnValue;
}

В перечислении 8-2, returnValue локальная переменная для хранения значения, возвращенного методом. Возвращаемое значение имеет тип NSString потому что все содержимое столбца является строками. Если таблица имела комбинацию NSTextFieldCell, NSImageCell, и т.д., returnValue обычно вводился бы более в общем, как id.

Затем, объект присваивается anObject к объекту в rowIndex смещение в namesArray свойство. Поскольку существует непосредственная корреляция между строкой, и индекс массива для соответствующего значения, получая доступ к объекту для строки является прямым.

Наконец, returnValue переменная установлена в значение, это выведено на экран в столбце. Чтобы устранить код и упростить возврат данных, это использует в своих интересах кодирование значения ключа.

Программно редактирующие данные в находящейся в NSCell таблице

Для Вашего приложения для редактирования содержания NSCell- основанное табличное представление, Вы реализуете tableView:setObjectValue:forTableColumn:row: метод протокола источника данных. Этот метод подобен tableView:objectValueForTableColumn:row:, который предоставляет данные для табличного представления, но вместо того, чтобы запросить возвратить значение для указанной строки и столбца, это обеспечивает новый значение для тот строка и ячейка.

Перечисление 8-3 показывает реализацию tableView:setObjectValue:forTableColumn:row: метод.

  Пример перечисления 8-3 tableView:setObjectValue:forTableColumn:row: реализация

- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
 
    // The column identifier string is the easiest way to identify a table column.
    NSString *columnIdentifer = [aTableColumn identifier];
 
    if ([columnIdentifer isEqualToString:@"name"]) {
        [namesArray replaceObjectAtIndex:rowIndex withObject:anObject];
    }
 
}

Реализация в качестве примера в Перечислении 8-3 исследует столбец identifier результат метода гарантировать, что это - столбец таблицы «Имен», это редактируется. Это - хорошая практика независимо от числа столбцов в таблице. После проверки идентификационных данных столбца код заменяет объект в namesArray с новым значением.

Создание привязки для находящегося в NSCell табличного представления

Метод привязки Какао, используемый в NSView- основанные таблицы отличаются значительно от используемого в NSCell- основанные таблицы. В NSCell- основанная таблица Вы связываете содержание столбца таблицы, связывающее с контроллером массива arrangedObjects, и затем сконфигурируйте привязку ячейки столбца. Вы никогда не связываете непосредственно с привязкой содержания табличного представления.