NSTableView отображает только «Ячейка табличного представления» - PullRequest
30 голосов
/ 23 сентября 2011

У меня есть NSTableView с делегатом и источником данных, указывающим на мой контроллер. Я попытался реализовать

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

Метод, но независимо от того, что я возвращаю, в таблице всегда отображается «Ячейка табличного представления» в данных. Есть идеи, что я могу делать не так? Прилагаются два рисунка, показывающих, что делегаты настроены правильно (также показано правильное количество строк).

What the table shows enter image description here

Обратите внимание, что я только что попытался вернуть @"Hello World" для всего, но я получаю тот же результат.

Ответы [ 6 ]

55 голосов
/ 23 мая 2012

Просто измените Content Mode на Cell Based для представления таблицы в IB. IB будет отображать Text Cell в качестве заполнителей ячеек, которые заполняются во время выполнения всем, что вы возвращаете из tableView:objectValueForTableColumn:row:

10 голосов
/ 24 сентября 2011

Наконец-то разобрался.Мои ячейки по какой-то причине, кажется, содержат и TableCellView И ячейку текстового поля.Я удалил Table Cell View и теперь все работает.Я понятия не имею, как я попал в это состояние.

enter image description here

9 голосов
/ 22 октября 2014

Более новая версия XCode:

  1. Выберите представление таблицы (убедитесь, что представление прокрутки или любое другое представление не выбрано).
  2. В правой части выберите«Attribute Inspector»
  3. Измените режим содержимого на «Cell Based» вместо «View Based»
  4. Сохраните изменения и повторно запустите проект.
6 голосов
/ 27 августа 2015

Большинство ответов включают преобразование компонента табличного представления в табличное представление на основе ячеек.Если это то, что вы хотите, то это хорошо, вы можете идти.В то время, когда задавался вопрос, таблицы на основе ячеек были нормой, и когда Apple изменила оконный компонент на компонент на основе представления, это явно вызвало много путаницы.Сегодня документы Apple рекомендуют вам использовать таблицы на основе представлений, а не таблицы.

Проблема, описанная в вопросе, возникает, если вы используете - tableView:objectValueForTableColumn:row: в своем источнике данных.Вы не можете использовать этот метод с таблицами на основе представления, он только для таблиц на основе ячеек.Вместо этого вам нужно использовать NSTableViewDelegate метод - tableView:viewForTableColumn:row:.Вам не нужно заставлять объект соответствовать протоколу NSTableViewDelegate, чтобы использовать этот метод, но он должен быть установлен как делегат таблицы.

В ответ на Cœur, цитируя из AppleОн-лайн документы.

Таблицы на основе NSCell по-прежнему поддерживаются В OS X v10.6 и более ранних версиях каждая ячейка табличного представления должна была быть подклассом NSCell.Этот подход вызвал ограничения при разработке сложных пользовательских ячеек, часто требуя от вас написать свои собственные подклассы NSCell.Предоставление анимации, такой как просмотр прогресса, также было чрезвычайно трудным.В этом документе эти типы табличных представлений упоминаются как основанные на NSCell табличные представления.Таблицы на основе NSCell по-прежнему поддерживаются в OS X v10.7 и новее, но обычно они используются только для поддержки устаревшего кода.В общем, вы должны использовать таблицы на основе NSView.

1 голос
/ 24 сентября 2011

Похоже, вы пропустили важный метод источника данных -numberOfRowsInTableView:. См. Руководство по программированию табличного представления: (табличное представление на основе представления) Обязательные методы и Руководство по программированию табличного представления: (табличное представление на основе ячейки) Предоставление данных в табличное представление программно для получения подробной информации .

По сути, самый первый метод NSTableViewDataSource, который называется numberOfRowsInTableView:. Только после того, как вы вернете ненулевое количество из этого метода, будут вызваны последующие методы tableView:objectValueForTableColumn:row: или tableView:willDisplayCell:forTableColumn:row:.

0 голосов
/ 23 сентября 2011

Вы неправильно понимаете, как фреймворки используют результат -tableView:objectValueForTableColumn:row:.

Чтобы выполнить более или менее то, что вы пытаетесь выполнить выше, переопределите метод делегата -tableView:willDisplayCell:forTableColumn:row:,Вот пример, взятый из одного из моих собственных приложений:

- (void)tableView:(NSTableView *)tableView
  willDisplayCell:(id)cell
   forTableColumn:(NSTableColumn *)tableColumn
              row:(NSInteger)row;
{
    NSString * displayName = [self.senders objectAtIndex:row];
    [cell setTitle:displayName];
    [cell setState:[self.selection containsObject:displayName]];
}

Это способ "старой школы", использующий таблицы на основе ячеек (которые по-прежнему используются по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...