Depuración de Xcode: visualización de imágenes

99

Me encanta usar el depurador de Xcode. Puede echar un vistazo al valor de una variable e incluso cambiarlo.

¿Pero puedo de alguna manera MOSTRAR la imagen a la que hace referencia una variable de imagen? Sé que puedo ver sus bytes sin procesar, pero sería mucho más amigable para los humanos mostrar una ventana con su contenido.

Es posible que Xcode no admita esto. ¿Quizás existe una herramienta externa que ayudaría a mostrar imágenes?

krasnyk
fuente

Respuestas:

273

Utilice Quick Look para inspeccionar imágenes en el depurador de Xcode.

Seleccione un NSImageo UIImageen el depurador, luego haga clic en el icono "ojo" de Vista rápida.

icono de "ojo" en la barra de herramientas del depurador de Xcode

Al igual que otras áreas de OS X, también puede utilizar spacebarQuick Look!

Ver un UIImage en el depurador de Xcode a través de Quick Look

Quick Look en el depurador también se puede implementar para sus propias clases:

Habilitación de Quick Look para tipos personalizados

La función Vista rápida de variables en el depurador de Xcode le permite obtener una evaluación visual rápida del estado de una variable de objeto a través de una representación gráfica, que se muestra en una ventana emergente, ya sea en la vista de variables del depurador o en su lugar en su código fuente.

Este capítulo describe cómo implementar un método de Vista rápida para sus tipos de clases personalizados, de modo que las variables de objeto de esos tipos también se puedan representar visualmente en la ventana emergente de Vista rápida.

pkamb
fuente
13
Mejor. Característica. ¡Nunca!
Sev
2
¡Esta es la respuesta más valiosa del año!
vedrano
8
¡Edades de codificación en Xcode y nunca supe de esta función! ¡¡¡Esto es asombroso !!! Muchas gracias
Joan Cardona
2
Conocía esta función, pero gracias por la sugerencia de la barra espaciadora. Mucho más fácil que hacer clic en el ojo con el mouse. :)
Chintan Patel
1
Trabaja con Xcode 10 y Swift 4.2 como un encanto. Gracias.
atereshkov
16

EDITAR:

A partir de Xcode 5, el depurador puede mostrarle la representación visual de las variables UIImage / CGImageRef.

Xcode en sí mismo no puede hacerlo. No conozco herramientas externas.

Lo que estoy haciendo para probar imágenes durante la depuración es convertir esos datos sin procesar en un formato de archivo de imagen, como .png, y luego guardarlo en algún lugar, y luego abrir la imagen con cualquier herramienta de visualización de imágenes.

Tengo un fragmento de código para ese propósito, que básicamente se ve así:

NSData *imageData = UIImagePNGRepresentation(self.myUIImage);
[imageData writeToURL:desktopURL atomically:YES];

Y solo estoy copiando y pegando este código donde quiero ver el contenido de una imagen sobre la marcha.

Asegúrese de deshacerse de este código tan pronto como sea posible debido al alto costo de la conversión de UIImageaNSData

Avi Shukron
fuente
2
sólo curiosidad: ¿por qué dice "(y no debería) hacerlo"? Hubo un tiempo en que la gente decía que las computadoras "no deberían" tener pantallas a color, ya que eran demasiado caras, o que un editor de texto utilizado por los programadores "no debería" comprobar la sintaxis de su código. en algún momento necesitamos pasar de ideas arcaicas, ¿no?
no sincronizado
Ok, entonces retiro el "no debería". Ojalá algún día los IDE interpreten las imágenes durante la depuración.
Avi Shukron
Esta es una gran idea y simplemente me ayudó, gracias. Algo obvio una vez que alguien lo señala, pero sigue siendo un gran indicador.
Scott Little
@unsynchronized, mira eso ... Xcode 5 puede mostrar imágenes en el depurador ...
Avi Shukron
14

Editar para Xcode 5: ahora, cuando pasa el cursor sobre el nombre de una variable de imagen, hay un icono de "ojo" a la derecha. ¡Simplemente haz clic para ver la imagen actual!

NOTA: a veces esto falla en Xcode, incluso si la imagen es correcta. Si esto sucede, O si no tiene una variable UIImage (por ejemplo, es una propiedad de otro objeto, aún puede usar la respuesta anterior:

Respuesta anterior: comenzando con la respuesta de Avraham, probé algunos experimentos para mostrar una imagen de iOS desde lldb sin tener que volver a compilarla o agregarla a una vista. Finalmente se me ocurrió:

e [UIImagePNGRepresentation(myImage) writeToFile:@"/Users/<userName>/Desktop/myImage.png" atomically:NO];

Guardo esta cadena en un editor de texto y la pego cuando la necesito. Esto almacena la imagen actual que me interesa (en este caso, "myImage") en un archivo PNG en el escritorio. Entonces puedo abrir este archivo con Vista previa.

Si está trabajando en un dispositivo iOS, puede usar

 e [UIImagePNGRepresentation(myImage) writeToFile:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingString:@"/myImage.png"] atomically:NO];

Entonces puedes usar el Finder; seleccione su dispositivo; "Archivos"; luego su aplicación de desarrollo y copie la imagen en su escritorio para verla.

Mackworth
fuente
+1000000 ¡Esta es una solución increíble! Me gustaría agregar que si está depurando en el dispositivo, puede usar algo como iFunBox o iExplorer para recuperar la imagen del dispositivo.
Quentin
Incluso puede escribir directamente a "/ Users / <su nombre de usuario> /"; de esta manera, no tendrá que buscar su carpeta temporal a través de GUID
Dannie P
Buena sugerencia (tenga en cuenta que debe usar / Users / <su nombre de usuario> /, no funciona con ~ /). Se actualizó la sugerencia en consecuencia.
mackworth
Sugerencia impresionante @mackworth. Gracias.
arango_86
13

Si desea trabajar con la consola lldb, utilice el comando cincel "visualizar"

propina:

después de la instalación, puede establecer un punto de interrupción condicional después de configurar el UIImage con la acción: "visualizar myUIImageToShowWithQuickLook"

ingrese la descripción de la imagen aquí

esto le mostrará la imagen automáticamente cuando el depurador se detenga.

Zaster
fuente
4

¿Qué pasa si no puede acceder a la imagen a través de la vista de variables?

Haciendo eco de lo que dijo @pkamb, puede usar la vista de variables para ver rápidamente una imagen. Pero, ¿y si no puedes acceder a la imagen?

por ejemplo, tengo una imagen en (contentViewController.view.subviews[0].subviews[1] as? UIImageView).image

pero si trato de expandirme contentViewControlleren la vista de variables, no exponen mis subvistas

ingrese la descripción de la imagen aquí

lo que puede hacer es hacer clic derecho, agregar una expresión, ¡y luego podrá verla!

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

wyu
fuente
Entonces, debería poder usar el mismo comando que el anterior: po [UIImagePNGRepresentation ((contentViewController.view.subviews [0] .subviews [1] as? UIImageView) .image) writeToFile: @ "/ Users / <userName> / Desktop /watchImage.png "atómicamente: NO];
mackworth
-7

Puede poner un punto de interrupción en la línea de su imagen, y luego en el depurador, simplemente escriba:

po your_UIImage_object

posignifica print object, es un comando GDB que mostrará varias informaciones útiles sobre el objeto pasado, en su caso la imagen.

Malloc
fuente
1
En realidad, usar po con el objeto UIImage directamente solo imprimirá en la consola la dirección de memoria del nombre de clase de la instancia. Algo como: <UIImage: 0x7fc98df6c7d0>
Daniel