Я пытаюсь создать исходный список для новой программы, и у меня возникла небольшая проблема с использованием основанного на представлении 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:
для базовых представлений структуры? Он выполняется, но ничего не делает.