Как определить структуру представления в моей программе iPhone во время работы на симуляторе?
Мне нужно проверить иерархию представлений в программе iPhone
Ответ 1
В соответствии с тем, что предлагает Янник, Эрика Садун имеет код здесь, который красиво печатает иерархию представлений (с информацией о классе и кадре). Вы можете сделать это в категории UIView со следующим интерфейсом:
#import <UIKit/UIKit.h>
@interface UIView (ExploreViews)
- (void)exploreViewAtLevel:(int)level;
@end
и реализация:
#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
Ответ 2
Есть встроенный способ сброса иерархии представлений: recursiveDescription
NSLog(@"%@", [view recursiveDescription]);
Он выведет что-то вроде этого:
<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'; […]
Смотрите: https://developer.apple.com/library/content/technotes/tn2239/_index.html
Ответ 3
Вам не нужно писать один оператор журнала или вообще изменять свой код.
Нажмите кнопку паузы.
Введите в консоль
po [[UIWindow keyWindow] recursiveDescription]
Ответ 4
Эти ответы - все варианты -recursiveDescription
, но прошло около трех лет с момента публикации вопроса, и в наши дни есть намного лучшие способы проверить вашу иерархию просмотров. -recursiveDescription
всегда был немного неуправляемым с большими иерархиями - вы потратили больше времени на просмотр своего выходного журнала, чем потратили на программирование!
Вот несколько новых решений:
-
Вы можете использовать DCIntrospect, чтобы распечатать иерархию представления и просматривать свойства и получать некоторые классные маркеры отладки на экране.
-
Вы можете использовать Spark Inspector чтобы увидеть иерархию вашего приложения и взаимодействовать с ним в 3D. Spark Inspector имеет боковую панель, которая отображает интерфейс Builder, и вы может настроить ваши представления во время работы вашего приложения. (Полное раскрытие: I я ведущий разработчик этого инструмента - присылайте мне свои запросы на функцию!)
-
Вы можете использовать PonyDebugger для подключения Chrome Inspector для вашего приложения - вы можете просматривать представление своего приложения иерархии в представлении DOM, и они также захватывают сетевой трафик, которые могут быть полезны.
Ответ 5
Попробуйте эту магию:
NSLog(@"%@", [self.view recursiveDescription]);
Ответ 6
вы можете использовать некоторый алгоритм:
-(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]];
}
}
И добавьте эту строку в viewDidLoad, например:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self inspectView:self.viewControllers level:@""];
}
источник: иерархия представления
Ответ 7
Я также рассмотрел эту проблему, и я придумал единственный рекурсивный метод как Категория на UIView. Он использует только базовые классы Foundation, поэтому он не такой сложный, как решение Erica.
Вот метод Category:
- (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];
}
}
Для получения более подробной информации ознакомьтесь с моим сообщением в блоге об этой проблеме: http://www.glimsoft.com/01/07/how-to-inspect-subviews-hierarchy-of-any-uiview/