2012-01-06 11 views
5

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ć.

+0

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

Odpowiedz

4

Oparte na widoku jest odrobinę inne niż oparte na komórkach.

Wszystko, co jest różne, zastępuje wartość zwracaną "id" na "NSView".

Zmień to:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 

do tego:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 

ta podana jest założenie używasz 10,7, a ty jesteś rzeczywiście dzieje do zwracania NSView.

+0

Zmieniłem "id" na "NSView *". Nie zmieniło wyników mojej aktualizacji (do oryginalnego postu). –

+0

Powinienem podziękować za złapanie tego. –

+0

Nie zwracaj NSTableCellView. Zwróć NSView. Zwrócony NSView nie musi mieć zainicjowanej ramki; NSControl kontroluje to za Ciebie. Wypełnij nowy NSView, dodaj do niego elementy - a następnie zwróć je. – evdude100

Powiązane problemy