2009-07-08 12 views

risposta

15

Ricordarsi di cercare nelle superclassi quando non riesci a trovare qualcosa. In questo caso, uno dei metodi necessari è NSTableView, che è la superclasse immediata di NSOutlineView.

La soluzione è get the row index for the item using rowForItem: e, se non è -1 (elemento non visibile/non trovato), create an index set with it with [NSIndexSet indexSetWithIndex:], passare tale indice impostato su the selectRowIndexes:byExtendingSelection: method.

+0

Ciao Peter, grazie per la risposta. Conosco già il metodo selectRowIndexes: byExtendingSelection :. Il problema è che NSOutlineView sta funzionando con NSIndexPath e non con NSIndexSet. – cocoafan

+0

Non vedo una singola istanza di NSIndexPath nella documentazione di NSOutlineView. Forse stai pensando a NSTreeController, che non stai utilizzando. Inoltre, una vista schema * è * una vista tabella, il che significa che tutte le funzionalità di visualizzazione tabella dovrebbero funzionare correttamente nella vista struttura. –

+0

Sì, vedo. A male che non esiste una soluzione integrata che non dipende dalla mia origine dati. Devo scrivere codice extra nella mia origine dati, giusto? – cocoafan

1

No, non esiste un metodo selectItem:, ma esiste un metodo rowForItem:. Se lo combini con il consiglio di Peter sull'uso di selectRowIndexes:byExtendingSelection: sopra, dovresti avere tutte le informazioni di cui hai bisogno.

se si voleva davvero avere un metodo per selezionare una voce, che mi sento di raccomandare chiamando setSelectedItem: per amor di coerenza, si potrebbe scrivere qualcosa di simile in una categoria a NSOutlineView

- (void)setSelectedItem:(id)item { 
    NSInteger itemIndex = [self rowForItem:item]; 
    if (itemIndex < 0) { 
     // You need to decide what happens if the item doesn't exist 
     return; 
    } 

    [self selectRowIndexes:[NSIndexSet indexSetWithIndex:itemIndex] byExtendingSelection:NO]; 
} 

Non ho idea se questo codice funziona davvero; L'ho appena buttato fuori per illustrare il concetto.

+0

Grazie a tutti e due per il vostro consiglio. – cocoafan

18

Ecco come sono finalmente arrivato. Suggerimenti e correzioni sono sempre ben accetti.

@implementation NSOutlineView (Additions) 

- (void)expandParentsOfItem:(id)item { 
    while (item != nil) { 
     id parent = [self parentForItem: item]; 
     if (![self isExpandable: parent]) 
      break; 
     if (![self isItemExpanded: parent]) 
      [self expandItem: parent]; 
     item = parent; 
    } 
} 

- (void)selectItem:(id)item { 
    NSInteger itemIndex = [self rowForItem:item]; 
    if (itemIndex < 0) { 
     [self expandParentsOfItem: item]; 
     itemIndex = [self rowForItem:item]; 
     if (itemIndex < 0) 
      return; 
    } 

    [self selectRowIndexes: [NSIndexSet indexSetWithIndex: itemIndex] byExtendingSelection: NO]; 
} 
@end 
+2

Grazie per questi metodi. Sono incredibilmente utili! Secondo me, questa risposta è più completa ed elaborata di quella precedentemente accettata. –

0

Ecco uno snippet di codice che ho utilizzato per selezionare a livello di codice un elemento in PXSourceList.

sourceList è un normale oggetto PXSouceList e volevo selezionare il secondo elemento nel primo gruppo del contorno.

NSInteger itemRow = [sourceList rowForItem:[[(SourceListItem *)[sourceListItems objectAtIndex:0] children] objectAtIndex:1]]; 
    [sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:itemRow] byExtendingSelection:YES]; 

Se non conoscete ancora, PXSourceList è un ottimo sostituto per un NSOutlineView se si è alla ricerca di itunes stile/mail contorni. Raccoglilo qui: PxSourceList

Problemi correlati