¿Cómo inspecciono la jerarquía de vistas en iOS?

170

¿Existe una herramienta GUI que inspeccione la jerarquía de vistas de una aplicación iOS? Estoy pensando en el inspector web de Webkit o en herramientas similares. Estoy buscando depurar problemas de diseño, como las vistas que tienen una posición o tamaño incorrectos, o un niño que no está contenido adecuadamente en su padre. Actualmente tengo que agregar afirmaciones que prueben estas diversas condiciones a mano, o establecer diferentes colores de fondo en diferentes vistas, y como se pueden imaginar, esa es una forma realmente tediosa de hacerlo.

Miré los instrumentos UI recorder, pero eso solo graba y reproduce las acciones de la interfaz de usuario 'y, en cualquier caso, solo funciona para aplicaciones Mac.

¿Hay una mejor solución?

Vaddadi Kartick
fuente

Respuestas:

168

Xcode 6 ahora tiene una inspección de jerarquía de vista 3D incorporada como Reveal App y Spark Inspector.

ingrese la descripción de la imagen aquí

Haga clic en el botón "Debug View Jerarquía" mientras su aplicación se está ejecutando para pausar la ejecución e inspeccionar las vistas en el momento actual.

ingrese la descripción de la imagen aquí

Más información en la documentación de Apple .

Levi McCallum
fuente
55
Si la opción de visualización de depuración no está disponible, consulte stackoverflow.com/questions/24040322/… .
kennytm
Al principio, no vi la barra de herramientas mostrada por Levi McCallum porque está en la parte inferior de la ventana de Xcode si la aplicación no tiene ninguna salida de depuración. Y una vez que se presiona el botón, la ventana Ver jerarquía estaba en blanco hasta que presioné uno de los botones en la parte inferior o ajusté uno de los deslizadores.
Carl Smith
Una vez que comienzas a confiar en esta herramienta, siempre se arruina. No sé por qué o cómo solucionarlo, pero parece suceder en vistas más complicadas.
Departamento B
263

No sé si hay una herramienta de inspección de vista GUI, pero he tenido suerte con el método de depuración en UIView: -recursiveDescription

si pausa el programa en el depurador e ingresa esto en GDB (Editar: también funciona en LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Obtiene una copia impresa de toda su jerarquía de vistas. También puede llamarlo en una vista específica para obtener una impresión de la jerarquía de vistas de esa vista.

Puede ser un poco tedioso leer la información que obtienes de ella, pero me ha resultado útil.

El crédito va a esta publicación de blog que habló sobre este método y también se vinculó a esta nota técnica de Apple útil, pero bastante difícil de encontrar .

Simon Goldeen
fuente
1
Tengo: error: no puedo encontrar la declaración de interfaz para '$ __ lldb_objc_class' ¿alguna idea? (lldb) po [[UIWindow keyWindow] recursiveDescription] error: no se puede encontrar la declaración de interfaz para '$ __ lldb_objc_class' error: no se puede encontrar la declaración de interfaz para '$ __ lldb_objc_class' error: 2 errores al analizar la expresión
Zennichimaro
1
Creo que esta respuesta ya no es la respuesta canónica, ya que ahora hay herramientas GUI disponibles que responden directamente a la pregunta '¿Hay una herramienta GUI ...?'
theraven
comenzando con xcode 5.1 Empecé a recibir este error cada vez que escribo recursiveDescription error: el método de instancia 'undoManager' tiene tipos de resultados incompatibles en diferentes unidades de traducción ('id' vs. 'NSUndoManager *') nota: el método de instancia 'undoManager' también declaró aquí el error : 1 errores al analizar la expresión
abbood
1
Si bien la pregunta es antigua y pregunta sobre métodos gráficos, esta respuesta específica se relaciona con soluciones textuales. Puede encontrar una discusión sobre la solución canónica en código, por ejemplo, aquí: stackoverflow.com/a/14193682/2431627 . es decir, utilizando la propiedad _printHierarchy a través de KVC.
Robin Macharg
46

Revelar captura de pantalla de la aplicación

Curiosamente, ahora hay otra opción, http://revealapp.com/ , que a partir de esta publicación está en una versión beta abierta (gratuita). Como puede ver, es otro inspector visual.

EDITAR 05/04/2014: Reveal está fuera de Beta y ya no es gratis. Sin embargo, hay una prueba de 30 días.

livingtech
fuente
1
He probado algunas herramientas para esto (Spark Inspector, iOS Hierarchy Viewer y la vista de Firebug en la herramienta de prueba de Frank). Hasta ahora, Reveal es mi favorito.
Estofado
1
Pero TOTALMENTE vale la pena. Mucho mejor que las herramientas Xcode integradas para ver vistas
Will Larche
35

Esta pregunta es antigua, pero permítanme poner información aquí sobre la nueva herramienta que desarrollo: https://github.com/glock45/iOS-Hierarchy-Viewer ingrese la descripción de la imagen aquí

Damian Kołakowski
fuente
¿Es posible actualizar la página automáticamente cuando navego a otra vista en el simulador? además, ¿es posible cambiar los valores en este visor (para poder hacer algunas pruebas en el navegador sin escribir código real)? gracias :)
Brian
1
@Brian, gracias Brain. Comencé a prototipar la posibilidad de cambiar los valores. Está desactivado en el lanzamiento oficial. Manténganse al tanto !
Damian Kołakowski
Muchas gracias por la sugerencia. ¡Logré resolver mi problema con esta herramienta, un problema que no se pudo resolver con el depurador de la interfaz de usuario de Xcode!
D6mi
Gracias, Damian, pero para las personas que leen esto, esta herramienta parece no mantenerse.
Vaddadi Kartick
17

ingrese la descripción de la imagen aquí

Solo para mantener este hilo actualizado, he estado jugando recientemente con Spark Inspector . No es gratis, pero es muy agradable.

livingtech
fuente
6

Gratis: solo escriba esto en inspector:

po [[UIWindow keyWindow] recursiveDescription]

Comercial: http://revealapp.com/ Probé la versión beta de revealapp, fue bueno, aunque tiene errores. Otra herramienta comercial: http://sparkinspector.com/ está funcionando sin problemas.

AVEbrahimi
fuente
Spark Inspector tiene un buen visor de notificaciones
thierryb
6

Rápido 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"))))
   }
}

Uso (en depurador): po myView.dump()

Vlad
fuente
2

Esto voltea todo en la ventana de depuración. (Difícil de leer aunque) :( Trabajando en iOS 10, Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()
Alix
fuente
0

La respuesta aprobada ya no funciona para mí, usando Xcode 8 y Swift 2.3. Esto es lo que funciona para mí:

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

mph
fuente
1
Gracias, mph, pero esto tampoco funciona en Swift 3: error: propiedad 'compartida' no encontrada en el objeto de tipo 'UIApplication'
Vaddadi Kartick
Swift 4 y Xcode 9.1 se quejan con "error: <EXPR>: 3: 32: error: no se puede llamar al valor del tipo sin función 'UIApplication' UIApplication.sharedApplication (). KeyWindow? .RecursiveDescription ()"
Jason Harrison