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.
Ciao John, hai capito perché è richiesto objectValueForTableColumn per la vista struttura basata su visualizzazione? Mi sto chiedendo la stessa cosa anch'io. – Indoor