Я пытаюсь создать список источников для новой программы, и у меня возникла небольшая проблема с использованием основанного на представлении NSOutlineView. Мой код работает нормально, используя NSOutlineView на основе ячеек, поэтому я немного запутался в происходящем.
Вот мой код для делегата и источника данных:
#pragma mark -
#pragma mark NSOutlineView Delegate
- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item {
return (item == nil) ? YES : [(SourceListNode *)item groupItem];
}
- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
if ([(SourceListNode *)item groupItem]) {
return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
}
else {
return [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
}
}
#pragma mark -
#pragma mark NSOutlineView Data Source
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
return (item == nil) ? [sourceListNodes count] : [(SourceListNode *)item numberOfChildren];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return (item == nil) ? YES : ([(SourceListNode *)item numberOfChildren] > 0);
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
return (item == nil) ? [sourceListNodes objectAtIndex:index] : [(SourceListNode *)item childAtIndex:index];
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return [(SourceListNode *)item name];
}
Когда я запускаю это через отладчик, он видит, что outlineView:objectValueForTableColumn:byItem:
не выполняется. Результатом является контурный вид без текста. Правильные ячейки созданы, и я могу выбрать их и расширить их. Чего мне не хватает?
ОБНОВЛЕНИЕ: я удалил свой список источников в IB, добавил новый и подключил его к моему объекту контроллера. Результаты были лучше, но в ячейках заголовка был текст «HEADER CELL», а в дочерних ячейках - «Table View Cell».
Я снова запустил программу через отладчик, и на этот раз outlineView:objectValueForTableColumn:byItem:
был выполнен. Однако текст ячейки не заполнялся.
Затем я обновил outlineView:viewForTableColumn:item:
следующим образом:
- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSTableCellView *result;
if ([(SourceListNode *)item groupItem]) {
result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];
}
else {
result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
}
[[result textField] setStringValue:[(SourceListNode *)item name]];
return result;
}
Теперь все работает как положено.
Короче говоря, я решил свою проблему. Однако у меня теперь есть другой вопрос. Какова цель outlineView:objectValueForTableColumn:byItem:
для базовых видов контуров вида? Он выполняется, но, похоже, ничего не делает.