Какао - NSTableView на основе представления с использованием одной ячейки в нескольких таблицах

У меня проблема. [единственный пример, который я могу найти, был показан во время одной из презентаций WWDC 2011 («Повышение производительности в Xcode 4»), но исходный код недоступен (это было приложение под названием Birdathon). Все остальное, что я придумываю, предназначено для iOS, и не имеет смысла.]

В принципе, у меня есть несколько NSTableView на основе представлений, и в настоящее время я размещаю поля изображения / текста в моем NSTableCellView непосредственно в столбце. У меня есть подкласс NSTableCellView, который дает мне выходы для присвоения значений каждому из текстовых полей, которые я использую в этой ячейке. DataSource и Delegate реализованы и работают нормально - TableView с моим настраиваемым NSTableViewCell работает нормально.

Моя проблема в том, что я хотел бы использовать одну и ту же ячейку в нескольких разных таблицах. Вместо того, чтобы каждый раз воссоздавать один и тот же макет, я чувствую, что смогу нарисовать NSTableCellView только один раз в IB. [- и действительно, пример Birdathon, который я упомянул, похоже, показывает, что NSTableCellView размещается в его собственном NIB.]

Я нашел ответ для iOS во многих местах, например здесь: Как загрузить пользовательские ячейки UITableViewCell из файлов Xib?

Может ли кто-нибудь помочь мне изменить это для Какао на Mac?

Спасибо,

Дэйвид


person DaveWalker    schedule 24.11.2011    source источник
comment
Уверены, что это NSTableView, а не UITableView?   -  person Dimme    schedule 25.11.2011
comment
Это то, что я пытаюсь сказать, возможно, не очень четко - я хочу сделать это в Cocoa для Mac с NSTableView, но я могу найти только примеры для iOS (Cocoa Touch) и, следовательно, использую UITableView. Причина для ссылки на вопрос UITableView заключается в том, что это решение - то, что мне нужно, но переведенное в NSTableView.   -  person DaveWalker    schedule 25.11.2011
comment
Извини, что веду себя глупо. Пример Birdathon - это UITableView, чего я не хочу. Итак, следующий очевидный вопрос: возможно ли вообще делать то, что я хочу, с NSTableView / Cocoa?   -  person DaveWalker    schedule 25.11.2011
comment
Вы пытались просто поместить все свои NSTables в один и тот же .xib, где вы также определяете свой NSCellView? Затем вы можете повторно использовать один и тот же NSCellView во всех своих таблицах, не обращаясь к другим файлам .xib.   -  person Motti Shneor    schedule 11.11.2017


Ответы (1)


Нравится!

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
    return count;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    NSView *customView = [tableView makeViewWithIdentifier:@"customview"
                                                     owner:self];
    …… // set properties
    return customView;
}

В конструкторе интерфейса установите для идентификатора пользовательского представления ячейки значение «customview», и оно будет создано автоматически! Пример:

 установить идентификатор в xcode

Просто замените "Автоматически" на идентификатор, который вы используете.

person Alex Zielenski    schedule 28.11.2011
comment
Алекс, спасибо за ответ. Однако у меня он уже работает, как в вашем примере, где ячейка представления таблицы (как на вашем снимке экрана) уже связана с / частью таблицы в IB. Что я пытаюсь сделать, так это переместить эту ячейку за пределы любой отдельной таблицы, чтобы один и тот же макет ячейки (который состоит из множества различных элементов управления) можно было использовать в нескольких таблицах, не меняя ее каждый раз. Я пробовал использовать тот же код, но ничего не появляется (предположительно, потому что он не знает, где искать). Я начинаю приходить к выводу, что это может быть просто невозможно ... - person DaveWalker; 28.11.2011
comment
Возможно, вам потребуется создать подкласс nsview. Это действительно не сложно. В противном случае, если вы должны использовать ib, вы можете сделать для него отдельный наконечник, и, как в примере, который вы связали, используйте init с именем наконечника - person Alex Zielenski; 28.11.2011
comment
Хорошо, спасибо, мне нужно лучше прочитать подклассы NSView. У меня был один тест, где это был отдельный Nib, но он не работал - но тогда я не думаю, что я создавал подклассы (или, если это было так, потому что я просто скопировал какой-то код откуда-то, а не понимать это). У меня уйдет пара дней, чтобы попробовать, но я расскажу, как я поступил, если / когда найду решение. Ваше здоровье. - person DaveWalker; 29.11.2011
comment
Привет, Дэвид, я пытаюсь сделать то же самое, что и ты, и не понимаю, как это сделать (казалось бы, простое). Как вы в итоге решили эту проблему? Ваше здоровье. - person Cypher; 30.07.2014
comment
@Cypher В случае, если это кому-то поможет, метод tableView:viewForTableColumn:row: находится в делегате табличного представления, не в источнике данных. - person SevenBits; 04.02.2015