Заполнение табличного представления программно

Для заполнения табличного представления программно необходимо реализовать NSTableViewDataSource и NSTableViewDelegate протоколы. Оба протокола содержат методы, которые важны для обеспечения содержания и создания ячеек для табличного представления. В частности необходимо реализовать:

Реализация источника данных

Метод источника данных требуется для таблицы работать. К счастью, реализация метода является очень прямой.

Перечисление 3-1 показывает простую реализацию метода источника данных numberOfRowsInTableView:, который просто возвращает число элементов в массиве строк имени.

Перечисление 3-1  простая реализация numberOfRowsInTableView

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
   return nameArray.count;
}

Реализация делегата

NSTableViewDelegate ответственно за обеспечение ячейки, это выведено на экран в табличном представлении, вместе с реализацией любого целевого действия или кода уведомления так, чтобы это могло взаимодействовать с делегатом. Что следует, две простых реализации tableView:viewForTableColumn:row: это может использоваться для отображения содержания namesArray объект модели. Первая реализация использует объект текстового поля для ячейки табличного представления; второе использование пользовательское представление ячейки таблицы это было определено в Интерфейсном Разработчике.

В обоих из этих простых случаев никакое действие не требуется ячейкой. Но если бы представление ячейки содержало кнопки, позволило редактировать или потребовалось, чтобы взаимодействовать с делегатом, то оно должно было бы использовать целевое действие или уведомления работе. Для примера реализации некоторых из этих действий посмотрите “Комплекс TableView” пример в демонстрационном проекте TableViewPlayground.

Создание и конфигурирование ячейки NSTextField

NSTableViewDelegate метод tableView:viewForTableColumn:row: создает и конфигурирует ячейку, это выведено на экран в табличном представлении. Псевдокод в Перечислении 3-2 создает NSTextField возразите как ячейка, и заполняет его с надлежащим именем для строки. (В этом примере таблица имеет только один столбец.)

Перечисление 3-2  простая реализация tableView:viewForTableColumn:row: это возвращает текстовое поле

- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {
 
    // Get an existing cell with the MyView identifier if it exists
    NSTextField *result = [tableView makeViewWithIdentifier:@"MyView" owner:self];
 
    // There is no existing cell to reuse so create a new one
    if (result == nil) {
 
         // Create the new NSTextField with a frame of the {0,0} with the width of the table.
         // Note that the height of the frame is not really relevant, because the row height will modify the height.
         result = [[NSTextField alloc] initWithFrame:...];
 
         // The identifier of the NSTextField instance is set to MyView.
         // This allows the cell to be reused.
         result.identifier = @"MyView";
      }
 
      // result is now guaranteed to be valid, either as a reused cell
      // or as a new cell, so set the stringValue of the cell to the
      // nameArray value at row
      result.stringValue = [self.nameArray objectAtIndex:row];
 
      // Return the result
      return result;
 
}

Код в Перечислении 3-2 сначала вызывает makeViewWithIdentifier:owner:, передача идентификатора @"MyView" определить, существует ли представление ячейки, доступное в пуле resuable ячеек. Если resuable ячейка доступна, код присваивает указанную строку nameArray оцените текстовому полю stringValue свойство и возвраты результат.

Если никакая ячейка с идентификатором @”MyView” доступно, новое текстовое поле создается. Кодовые наборы идентификатор нового текстового поля к @”MyView” когда возможность возникает, так, чтобы это могло быть снова использовано. Наконец, как в первом случае, stringValue из текстового поля установлен в корректное nameArray значение и результат возвращаются.

Получение представления ячейки таблицы от интерфейсного разработчика

Наиболее вероятная ситуация состоит в том, что Вы разработаете ячейку в Интерфейсном Разработчике и захотите выбрать ее и затем заполнить значения в той ячейке. Реализация для этой ситуации показана в Перечислении 3-3. Этот пример предполагает, что уже существует таблица, составленная в Интерфейсном Разработчике с идентификатором столбца @”MyView” и представление ячейки, также имеющее идентификатор @”MyView”.

Перечисление 3-3  простая реализация tableView:viewForTableColumn:row: это возвращает представление ячейки таблицы

- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {
 
      // Retrieve to get the @"MyView" from the pool or,
      // if no version is available in the pool, load the Interface Builder version
      NSTableCellView *result = [tableView makeViewWithIdentifier:@"MyView" owner:self];
 
      // Set the stringValue of the cell's text field to the nameArray value at row
      result.textField.stringValue = [self.nameArray objectAtIndex:row];
 
      // Return the result
      return result;

Эта реализация пытается получить представление ячейки с @”MyView” идентификатор от пула допускающих повторное использование ячеек. Если нет никакого допускающего повторное использование представления, взглядов кода в Интерфейсном Разработчике для столбца таблицы и ячейки с @”MyView” идентификатор. После того, как найденный, makeViewWithIdentifier:owner: метод возвращает представление ячейки и остальную часть кодовых наборов ячейка строковое значение.