2015-07-09 19 views
5

Qual è il modo più efficace per espandere tutti gli oggetti di una classe specifica in un NSOutlineView? (L'origine dati della vista struttura è un NSTreeController).NSOutlineView: espande tutti gli oggetti di una classe specifica solo

Diciamo che ho

classA 
classA 
    - classA 
     - classC 
     - classC 
    - classB 
     - classC 
     - classC 
classB 
    - classC 

voglio ampliare solo gli oggetti classA. Devo ripetere tutte le tre verifiche verificando quale classe appartiene a ciascun oggetto?

UPDATE Spiacente, devo fare una correzione. Gli oggetti outlineView sono NSTreeNodes dall'origine dati NSTreeController. E solo il "rappresentatoOggetto" sono quelle mie classi personalizzate.

Quindi la struttura con tali classi è corretta, ma non sono direttamente accessibili come nodi della vista struttura.

risposta

2

Per quello che vale, l'importante "colla" che ho menzionato nel commento è più o meno direttamente da questo bellissimo post sul blog: Saving the expand state of a NSOutlineView.

Ho preso tutte le classi nel mio albero, e li ha resi sottoclassi di una classe astratta con una proprietà expanded, così ogni representedObject in un NSTreeNode ha expanded come una proprietà.

Ma non è nemmeno necessario farlo se non si cura di persistere expanded nel modello di dati.

La cosa semplice da fare è per scorrere solo le righe:

for (NSUInteger row = 0; row < [outlineView numberOfRows]; row++) 
    { 
     // Expand item if it's an classA 
     NSTreeNode* treeNode = [outlineView itemAtRow:row]; 
     if ([treeNode.representedObject isKindOfClass:[ClassA class]]) 
      [sender.animator expandItem:treeNode]; 
    } 

... si noterà che per il ciclo prende in prestito un sacco di struttura dal post sul blog di riferimento.

Quindi penso che la mia risposta sia un pigro, "sì, iterate l'intero albero". Almeno l'albero visualizzato.

EDIT: Per coloro che sono un po 'troppo zelante su MVC, ora mi sento che è necessario precisare che il codice di cui sopra dovrebbe essere nella classe di usare come controller NSOutlineView, che di solito implementare <NSOutlineViewDelegate>

+1

Spiacente, devo fare una correzione.Gli oggetti outlineView sono NSTreeNodes dall'origine dati NSTreeController. E solo il "rappresentatoOggetto" sono quelle mie classi personalizzate. Quindi non posso aggiungere alcuna proprietà a questi oggetti, perché non sottoclassi i nodi. – aneuryzm

+1

@Patrick - Semplicemente l'iterazione delle righe è la cosa semplice, quindi con il bounty dovresti specificare O (righe) non tagliarlo. Continuo a pensare che il wrapper NSTreeNode non sia un grande ostacolo per quanto sopra, ma devo fare lo strabismo sul mio vecchio codice per la colla. – stevesliva

-1

Devo ripetere tutte e tre le verifiche a quale classe appartiene ciascun oggetto?

Sì, perché è ciò che si vuole fare.

ma non è così facile come in A di stevesliva:

A. Non dovrebbe iterare gli elementi della vista struttura. È una vista Non ha niente a che fare con i dati. I. e., Se un nodo è chiuso, i discendenti sono non nell'elenco delle righe. Questo perché non ci sono file per loro.

B. Invece itera sul contenuto del controller dell'albero. I controllori sono creati per l'accesso ai dati, quindi è il posto giusto per accedere ai dati. -arrangedObjects (NSTreeController) consente di accedere al contenuto.

+1

È facile come la risposta di stevesilva perché non c'è indicazione che l'OP voglia espandere i nodi che * contengono * oggetti 'classA', semplicemente espande quelli che * sono * oggetti' classA'. Se un oggetto 'classA' si trova all'interno di un oggetto' classB' che è compresso, non importa se quell'oggetto 'classA' è" espanso "o" collassato ". Questo non ha un significato particolare. Quindi, è sufficiente camminare per le righe ed espandere quelle che si incontrano che sono 'classA'. –

+1

C'è un'indicazione: "per espandere ** tutti ** gli oggetti di una classe specifica". Accanto a questo, è un approccio metodicamente sbagliato chiedere una visione per i dati come menzionato. –

+1

@ AminNegm-Awad - Penso che ti ami senza motivo se pensi di non poter richiedere una vista quando cerchi di modificare in modo efficiente la vista e non il modello. È come dichiarare che non è possibile cancellare tutte le sottoview di una vista con il codice della gerarchia delle viste, il che sarebbe ridicolo. I controllori hanno una scarsa proprietà dei loro punti di vista in modo esplicito perché le viste assumono la proprietà della gerarchia della vista e, di sicuro, è possibile attraversare la gerarchia della vista quando si modifica ciò che viene visualizzato. – stevesliva

Problemi correlati