представления NSTableView на основе представлений из XIB?

Возможно ли иметь отдельный файл XIB для NSTableCellView основанного на представлении NSTableView? Может быть, с помощью NSViewController?


person bijan    schedule 09.05.2012    source источник


Ответы (1)


Да, кажется, это возможно.

Из документации Apple:

Чтобы функционировать, программно реализованная таблица на основе представления должна реализовать следующее:

...

Метод - (NSView *)tableView:viewForTableColumn:row:, определенный протоколом NSTableViewDelegate. Этот метод предоставляет таблице представление для отображения в виде ячейки для определенного столбца и строки, а также заполняет эту ячейку соответствующими данными.

Таким образом, вы можете иметь объект класса NSView (или любого подкласса) и вернуть его после того, как вы правильно заполнили его данными. Откуда вы берете этот предмет, не представляет интереса. Насколько я знаю, можно было бы сделать, например, следующее:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Assume you have a XIB called View.xib
    [NSBundle loadNibNamed:@"View" owner:self];
    
    // And you have an IBOutlet to your NSTableView (that's view based) called tView
    [tView reloadData];
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
     return 20;
}

- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {


    // Assume your class has an IBOutlet called contentOfTableView, 
    // your class is File's Owner of the View.xib and you connected the outlet.
    return contentOfTableView;

}

Надеюсь, что это работает. Я просто собрал это вместе, имея в виду грубую идею. Удачи!

person pbx    schedule 29.05.2012
comment
Спасибо! Итак, contentOfTableView — это какой-то NSView? Как вид узнает, какой NIB загрузить? - person bijan; 29.05.2012
comment
Если вы установите свой класс контроллера как владельца файлов в View.xib, а затем используете: loadNibNamed, вы загружаете сам наконечник. Указав себя владельцем (сравните метод NSBundle), вы сообщаете Cocoa, что заполнитель должен быть - да - заменен вашим объектом контроллера. В View.xib вы подключили IBOutlet contentOfTableView к владельцу файлов. А это ваш контроллер теперь после того, как ваш xib был загружен в память. Таким образом, вы можете использовать эту розетку полностью, как если бы вы объявили ее обычной розеткой в ​​том же xib. - person pbx; 29.05.2012