Подтвердить что ты не робот

NSTableView отображает только "Table View Cell"

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

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

Метод, но независимо от того, что я возвращаю, таблица всегда показывает "Table View Cell" в данных. Любые идеи о том, что я могу делать неправильно? Прикреплены две фотографии, показывающие, что я правильно настроил делегаты (это также показывает правильное количество строк).

What the table showsenter image description here

Заметьте, что я просто попробовал вернуть @"Hello World" для всех, но получаю тот же результат.

4b9b3361

Ответ 1

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

Ответ 2

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

enter image description here

Ответ 3

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

  • Выберите вид таблицы (убедитесь, что режим прокрутки или любое другое представление не выбрано).
  • С правой стороны выберите "Attribute Inspector"
  • Измените режим содержимого на "Cell Based" вместо "View Based".
  • Сохраните изменения и повторно запустите проект.

Ответ 4

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

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

В ответ на Cœur, цитируя Apple On-line docs.

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

Ответ 5

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

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

Ответ 6

Вы не понимаете, как результат -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]];
}

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