Come posso controllare la gerarchia delle viste in iOS?


170

Esiste uno strumento GUI che controlla la gerarchia di visualizzazione di un'app iOS? Sto pensando all'ispettore web di Webkit o strumenti simili. Sto cercando di eseguire il debug di problemi di layout, ad esempio viste con posizione o dimensioni errate o un bambino non correttamente contenuto nel suo genitore. Attualmente devo aggiungere affermazioni che testano manualmente queste varie condizioni o impostano colori di sfondo diversi su viste diverse e, come puoi immaginare, è un modo davvero noioso di procedere.

Ho esaminato quello di Instruments UI recorder, ma questo registra e riproduce solo azioni dell'interfaccia utente` e, in ogni caso, funziona solo per le app Mac.

C'è una soluzione migliore?

Risposte:


168

Xcode 6 ora ha l'ispezione della gerarchia della vista 3D integrata come Reveal App e Spark Inspector.

inserisci qui la descrizione dell'immagine

Fai clic sul pulsante "Debug View Hierarchy" mentre l'app è in esecuzione per mettere in pausa l'esecuzione e ispezionare le viste al momento attuale.

inserisci qui la descrizione dell'immagine

Maggiori informazioni nella documentazione di Apple .


5
Se l'opzione di debug della vista non è disponibile, consultare stackoverflow.com/questions/24040322/… .
kennytm,

All'inizio, non ho visto la barra degli strumenti mostrata da Levi McCallum perché è in fondo alla finestra di Xcode se l'app non ha alcun output di debug. E una volta premuto il pulsante, la finestra Visualizza gerarchia era vuota fino a quando non ho premuto uno dei pulsanti in basso o regolato uno dei cursori.
Carl Smith,

Una volta che inizi a fare affidamento su questo strumento, esce sempre fuori. Non so perché o come risolverlo, ma sembra accadere su viste più complicate.
Departamento B,

263

Non so se esiste uno strumento di ispezione della vista della GUI, ma ho avuto un po 'di fortuna con il metodo di debug su UIView: -recursiveDescription

se sospendi il programma nel debugger e lo inserisci in GDB (Modifica: funziona anche in LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Viene stampata l'intera gerarchia della vista. Puoi anche chiamarlo su una vista specifica per ottenere una stampa della gerarchia di vista di quella vista.

Può essere un po 'noioso passare in rassegna le informazioni che ne ricavi, ma mi è stato utile.

Il merito va a questo post sul blog che parlava di questo metodo e anche collegato a questa nota tecnica Apple utile, ma piuttosto difficile da trovare .


1
Ho: errore: impossibile trovare la dichiarazione dell'interfaccia per '$ __ lldb_objc_class' qualche idea? (lldb) po Errore [[UIWindow keyWindow] recursiveDescription]: impossibile trovare la dichiarazione dell'interfaccia per l'errore "$ __ lldb_objc_class": impossibile trovare la dichiarazione dell'interfaccia per l'errore "$ __ lldb_objc_class": 2 errori durante l'analisi dell'espressione
Zennichimaro

1
Credo che questa risposta non sia più la risposta canonica, poiché ora sono disponibili strumenti GUI che rispondono direttamente alla domanda "Esiste uno strumento GUI ...?"
theraven

a partire da xcode 5.1 Ho iniziato a ricevere questo errore ogni volta che digito recursiveDescription error: il metodo di istanza 'undoManager' ha tipi di risultati incompatibili in diverse unità di traduzione ('id' vs. 'NSUndoManager *') nota: il metodo di istanza 'undoManager' ha anche dichiarato qui l'errore : 1 errori durante l'analisi dell'espressione
circa il

1
Mentre la domanda è vecchia e pone domande sui metodi grafici, questa risposta specifica riguarda soluzioni testuali. Una discussione sulla soluzione canonica in-code può essere trovata ad esempio qui: stackoverflow.com/a/14193682/2431627 . cioè usando la proprietà _printHierarchy tramite KVC.
Robin Macharg,

46

Rivela screenshot dell'app

Stranamente, ora c'è un'altra opzione, http://revealapp.com/ , che a partire da questo post è in una versione beta (gratuita) aperta. Come puoi vedere è un altro ispettore visivo.

EDIT 2014-04-05: Reveal è fuori beta e non è più gratuito. C'è una prova di 30 giorni, tuttavia.


1
Ho provato alcuni strumenti per questo (Spark Inspector, iOS Hierarchy Viewer e la vista simile a un firebug nello strumento di test di Frank). Finora Reveal è il mio preferito.
Stufato

1
Ma TOTALMENTE ne vale ancora la pena. Molto meglio degli strumenti Xcode integrati per la visualizzazione delle viste
Will Larche,

35

Questa domanda è vecchia ma lasciami inserire qui informazioni sul nuovo strumento che sviluppo: https://github.com/glock45/iOS-Hierarchy-Viewer inserisci qui la descrizione dell'immagine


è possibile aggiornare automaticamente la pagina quando passo a un'altra vista nel simulatore? inoltre, è possibile modificare i valori in questo visualizzatore (quindi posso fare alcuni test sul browser senza scrivere codice reale)? grazie :)
Brian

1
@Brian grazie Brain. Ho iniziato a prototipare la possibilità di modificare i valori. È disattivato nella versione ufficiale. Rimanete sintonizzati !
Damian Kołakowski,

Grazie mille per il suggerimento. Sono riuscito a risolvere il mio problema con questo strumento, un problema che non è stato possibile risolvere utilizzando il debugger dell'interfaccia utente di Xcode!
D6mi,

Grazie, Damian, ma per le persone che leggono questo, questo strumento sembra non mantenuto.
Vaddadi Kartick,



6

Gratuito: basta digitare questo in ispettore:

po [[UIWindow keyWindow] recursiveDescription]

Commerciale: http://revealapp.com/ Ho testato la versione beta di revealapp, ma era buona anche se ha dei bug. Un altro strumento commerciale: http://sparkinspector.com/ funziona senza problemi.


Spark Inspector ha un bel visualizzatore di notifiche
thierryb

6

Swift 4.

iOS :

extension UIView {

   // Prints results of internal Apple API method `recursiveDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("recursiveDescription"))))
   }
}

macOS :

extension NSView {

   // Prints results of internal Apple API method `_subtreeDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("_subtreeDescription"))))
   }
}

Utilizzo (nel debugger): po myView.dump()


2

Questo dump tutto nella finestra di debug. (Difficile da leggere) :( Lavorando su iOS 10, Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()

0

La risposta approvata non funziona più per me, utilizzando Xcode 8 e Swift 2.3. Ecco cosa funziona per me:

po UIApplication.sharedApplication().keyWindow?.recursiveDescription()


1
Grazie, mph, ma questo non funziona neanche in Swift 3: errore: proprietà 'condivisa' non trovata sull'oggetto di tipo 'UIApplication'
Vaddadi Kartick

Swift 4 e Xcode 9.1 lamentano "errore: <EXPR>: 3: 32: errore: impossibile chiamare il valore del tipo non funzionale 'UIApplication' UIApplication.sharedApplication (). KeyWindow? .RecursiveDescription ()"
Jason Harrison

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.