Próbuję utworzyć listę źródłową dla nowego programu i mam mały problem za pomocą opartego na widoku NSOutlineView. Mój kod działa dobrze przy użyciu NSOutlineView opartego na komórce, więc jestem nieco zdezorientowany tym, co się dzieje.outlineView: objectValueForTableColumn: byItem: nie nazywane
Oto mój kod do źródła delegata i danych:
#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];
}
Kiedy uruchomić to przez debugger to zobaczyć, że outlineView:objectValueForTableColumn:byItem:
nie wykonuje. Rezultatem jest widok konspektu bez tekstu. Tworzone są prawidłowe komórki i jestem w stanie je wybrać i rozwinąć. czego mi brakuje?
AKTUALIZACJA: Usunąłem moją listę źródeł w IB, dodałem nową i połączyłem ją z obiektem kontrolera. Wyniki były lepsze, ale komórki nagłówkowe miały tekst "HEADER CELL", a komórki potomne miały "Table View Cell".
Uruchomiłem program przez debugger ponownie i tym razem został wykonany outlineView:objectValueForTableColumn:byItem:
. Nie zapełnił jednak tekstu komórki.
I wtedy aktualizowany outlineView:viewForTableColumn:item:
następująco:
- (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;
}
Teraz wszystko działa zgodnie z oczekiwaniami.
Krótko mówiąc, rozwiązałem mój problem. Jednak mam teraz inne pytanie. Jaki jest cel outlineView:objectValueForTableColumn:byItem:
dla widoków konspektu podstawy widoku? Wykonuje, ale nie wydaje się, aby cokolwiek zrobić.
Cześć John, czy od tego czasu zorientowałeś się, dlaczego obiekt objectValueForTableColumn jest wymagany do widoku widoku opartego na widoku? Sam się nad tym zastanawiam. – Indoor