Основанный на представлении NSTableView от Xib - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть NSTableView, который создается программно.У меня есть несколько вариантов настройки ячеек в каждом столбце в зависимости от типа столбца и источника данных (т. Е. Очень легко иметь кнопки или флажки в зависимости от типа столбца и того, что находится в источнике данных).

Теперь ямне нужно иметь возможность полностью настроить ячейку, поэтому я пытаюсь загрузить NSView из xib и вернуть его из метода viewForTableColumn делегата таблиц.Я не очень часто использовал IB за пределами iOS, и я не очень хорошо разбираюсь в том, как следует устанавливать различные выходы и типы классов, особенно когда большая часть пользовательского интерфейса создается за пределами IB.Я читал много постов здесь и на других сайтах, но в большинстве примеров либо создается весь пользовательский интерфейс в IB, либо нет.

В настоящее время у меня есть TestCell.xib, который был создан путем выбора View из NewФайл диалога.Я также создал класс target-c под названием TestCell.В IB я установил класс представления на TestCell и перетащил выходы для элемента управления меткой и кнопки в класс TestCell.

В классе делегата таблицы у меня есть следующее:

- (NSView*)tableView:(NSTableView*)tableView viewForTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)row {
    NSView* view = [tableView makeViewWithIdentifier:customRowXibName owner:self];
    if( view == nil ) {
        NSArray* nibObjects = nil;
        if( [[NSBundle mainBundle] loadNibNamed:customRowXibName owner:self topLevelObjects:&nibObjects] ) {
            view = [nibObjects lastObject];
        }
    }

    return view;
}

Однако табличное представление ничего не показывает.Я также получаю следующие ошибки для обоих элементов управления в представлении при загрузке xib:

Failed to connect (button) outlet from (TableListViewDelegate) to (NSButton): missing setter or instance variable

Я предполагаю, что это потому, что я устанавливаю владельца self при загрузке xib.

Мои вопросы:

  1. В IB, на что должен быть установлен заполнитель Владелец файла?В настоящее время установлено значение TestCell, но я не верю, что это правильно.
  2. Можно ли использовать «TestCell» в качестве идентификатора?Нужно ли устанавливать этот идентификатор в IB?Или мне нужно вызвать registerNib: forIdentifier для табличного представления?
  3. При вызове loadNibNamed, какой владелец должен быть установлен?

1 Ответ

0 голосов
/ 15 марта 2019

Мне удалось заставить это работать, выполнив следующее:

  1. В IB задайте для владельца файла класс, который загружает Xib (в данном случае NSTableViewDelegate).
  2. В делегате создайте выход для вашей пользовательской ячейки и подключите его в IB (я использовал Инспектор соединений с выбранным владельцем файла).
  3. В tableView: viewForTableColumn:вызов строки: [tableView makeViewWithIdentifier:@"Xib Name" owner:self]

  4. Если это возвращает nil, тогда вызовите: [[NSBundle mainBundle] loadNibNamed:@"Xib Name" owner:self topLevelObjects:&nibObjects] с nibObjects, равным nil NSArray *.

  5. ЕслиloadNibNamed возвращает YES, тогда выход, созданный в делегате, теперь должен указывать на вновь загруженное представление.Убедитесь, что для идентификатора представлений установлено @ @ Xib Name, чтобы вы могли использовать кэшированные представления.

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