iphone - fly - test ios apps
Necesito inspeccionar la jerarquía de vistas en un programa de iPhone (7)
En la línea de lo que Yannick sugiere, Erica Sadun tiene un código here que imprime bastante la jerarquía de vistas (con información de clase y marco). Puede convertir esto en una categoría UIView con la siguiente interfaz:
#import <UIKit/UIKit.h>
@interface UIView (ExploreViews)
- (void)exploreViewAtLevel:(int)level;
@end
e implementación:
#import "UIView+ExploreViews.h"
void doLog(int level, id formatstring,...)
{
int i;
for (i = 0; i < level; i++) printf(" ");
va_list arglist;
if (formatstring)
{
va_start(arglist, formatstring);
id outstring = [[NSString alloc] initWithFormat:formatstring arguments:arglist];
fprintf(stderr, "%s/n", [outstring UTF8String]);
va_end(arglist);
}
}
@implementation UIView (ExploreViews)
- (void)exploreViewAtLevel:(int)level;
{
doLog(level, @"%@", [[self class] description]);
doLog(level, @"%@", NSStringFromCGRect([self frame]));
for (UIView *subview in [self subviews])
[subview exploreViewAtLevel:(level + 1)];
}
@end
¿Cómo puedo determinar cuál es la estructura de vista en mi programa de iPhone mientras se ejecuta en el simulador?
Estas respuestas son todas variantes de -recursiveDescription
, pero han pasado aproximadamente tres años desde que se publicó la pregunta y en estos días hay formas mucho mejores de inspeccionar la jerarquía de vistas. -recursiveDescription
siempre fue un poco inmanejable con grandes jerarquías. ¡ -recursiveDescription
más tiempo revisando tu Registro de salida de lo que pasabas programando!
Aquí hay algunas soluciones nuevas:
Puede usar DCIntrospect para imprimir la jerarquía de la vista y las propiedades de la vista, y obtener algunos marcadores de depuración en la pantalla.
Puede usar el Inspector de chispas para ver la jerarquía de vistas de su aplicación e interactuar con ella en 3D. El Spark Inspector tiene una barra lateral que refleja el Creador de Interfaz y puedes ajustar tus vistas mientras tu aplicación se está ejecutando. (Revelación completa: soy el desarrollador principal de esta herramienta. ¡Envíeme sus solicitudes de funciones!)
Puede usar PonyDebugger para conectar Chrome Inspector a su aplicación; puede ver la jerarquía de vistas de su aplicación en la vista DOM, y también capturan el tráfico de red, lo que puede ser útil.
Hay una forma integrada de volcar la jerarquía de vistas: recursiveDescription
NSLog(@"%@", [view recursiveDescription]);
Saldrá algo como esto:
<UIView: 0x6a107c0; frame = (0 20; 320 460); autoresize = W+H; layer = […]
| <UIRoundedRectButton: 0x6a103e0; frame = (124 196; 72 37); opaque = NO; […]
| | <UIButtonLabel: 0x6a117b0; frame = (19 8; 34 21); text = ''Test''; […]
Consulte: https://developer.apple.com/library/content/technotes/tn2239/_index.html
No tiene que escribir una sola declaración de registro o alterar su código en absoluto.
Pulse el botón de pausa.
Introduce lo siguiente en la consola.
po [[UIWindow keyWindow] recursiveDescription]
Prueba esta magia:
NSLog(@"%@", [self.view recursiveDescription]);
Puedes usar algo como esto:
-(void)inspectView:(UIView *)aView level:(NSString *)level {
NSLog(@"Level:%@", level);
NSLog(@"View:%@", aView);
NSArray *arr = [aView subviews];
for (int i=0;i<[arr count];i++) {
[self inspectView:[arr objectAtIndex:i]
level:[NSString stringWithFormat:@"%@/%d", level, i]];
}
}
Y agregue esta línea en un viewDidLoad por ejemplo:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self inspectView:self.viewControllers level:@""];
}
fuente: jerarquía de vistas
También me ocupé de este problema, y se me ocurrió un método recursivo único como categoría en UIView. Utiliza solo clases básicas de Foundation, por lo que no es tan complejo como la solución de Erica.
Aquí está el método de Categoría:
- (void)printSubviewsWithIndentation:(int)indentation {
NSArray *subviews = [self subviews];
for (int i = 0; i < [subviews count]; i++) {
UIView *currentSubview = [subviews objectAtIndex:i];
NSMutableString *currentViewDescription = [[NSMutableString alloc] init];
for (int j = 0; j <= indentation; j++) {
[currentViewDescription appendString:@" "]; // indent the description
}
// print whatever you want to know about the subview
[currentViewDescription appendFormat:@"[%d]: class: ''%@''", i, NSStringFromClass([currentSubview class])];
// Log the description string to the console
NSLog(@"%@", currentViewDescription);
[currentViewDescription release];
// the ''recursiveness'' nature of this method
[currentSubview printSubviewsWithIndentation:indentation+1];
}
}
Para obtener información más detallada, consulte mi blog sobre este tema: http://www.glimsoft.com/01/07/how-to-inspect-subviews-hierarchy-of-any-uiview/