2012-01-06 16 views
5

Sto provando a creare un elenco di sorgenti per un nuovo programma e sto riscontrando un piccolo problema utilizzando un NSOutlineView basato su visualizzazione. Il mio codice funziona bene utilizzando un NSOutlineView basato su cella, quindi sono un po 'confuso su ciò che sta accadendo.outlineView: objectValueForTableColumn: byItem: not called

Ecco il mio codice per l'origine delegato e dati:

#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]; 
} 

Quando ho eseguito questo attraverso il debugger si vede che outlineView:objectValueForTableColumn:byItem: non viene eseguito. Il risultato è una vista senza testo. Vengono create le celle corrette e sono in grado di selezionarle ed espanderle. Cosa mi manca?

AGGIORNAMENTO: ho cancellato la mia lista sorgente in IB, ne ho aggiunta una nuova e l'ho collegata all'oggetto controller. I risultati erano migliori, ma le celle di intestazione avevano il testo "HEADER CELL" e le celle figlio avevano "Cella vista tabella".

Ho eseguito nuovamente il programma tramite il debugger e questa volta è stato eseguito outlineView:objectValueForTableColumn:byItem:. Non ha però popolato il testo della cella.

ho poi aggiornato outlineView:viewForTableColumn:item: come segue:

- (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; 
} 

Ora tutto funziona come previsto.

Quindi, in breve, ho risolto il mio problema. Tuttavia, ora ho un'altra domanda. Qual è lo scopo di outlineView:objectValueForTableColumn:byItem: per le viste del profilo della vista? Esegue, ma non sembra fare nulla.

+0

Ciao John, hai capito perché è richiesto objectValueForTableColumn per la vista struttura basata su visualizzazione? Mi sto chiedendo la stessa cosa anch'io. – Indoor

risposta

4

La visualizzazione è un po 'diversa dalla cella.

Tutto ciò che è diverso è la sostituzione del valore di ritorno "id" in "NSView".

Modifica questo:

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

A tal:

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

Questo è dato il presupposto si esegue 10,7, e si sono in realtà andare per restituire un NSView.

+0

Ho cambiato 'id' in' NSView * '. Non ha modificato i risultati del mio aggiornamento (al post originale). –

+0

Dovrei aggiungere grazie per aver capito questo. –

+0

Non restituire un NSTableCellView. Restituisce un NSView. L'NSView che si restituisce non deve avere un frame inizializzato; NSControl controlla quello per te. Compilare un nuovo NSView, aggiungere elementi ad esso - quindi restituirlo. – evdude100

Problemi correlati