¿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?

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 .


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 .


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.


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í


¿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




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()


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()

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()


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.