Как определить структуру представления в моей программе iPhone во время работы на симуляторе?Мне нужно проверить иерархию представлений на iPhone-программе
ответ
Вдоль линий, что предполагает Янник , Эрика Садун имеет код here, который красиво отображает иерархию представлений (с информацией о классе и кадре). Вы можете сделать это в категорию 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
вы можете использовать некоторые Algo так:
-(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:@""];
}
источник: view hierarchy
Там есть встроенный способ сбросить иерархию вида: 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
NSLog (@ "% @", [view recursiveDescription]); – malhal
Я также занимался этой проблемой, и я придумал один рекурсивный метод как категории на UIView. Он использует только базовые классы Foundation, поэтому он не такой сложный, как решение Erica.
Вот метод Категория:
- (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/
Постарайся это волшебство:
NSLog(@"%@", [self.view recursiveDescription]);
Это сработало, но мне пришлось использовать 'performSelector: withObject:' в Xcode 5.1.1; в противном случае это была ошибка. – johnnieb
Эти ответы все варианты -recursiveDescription
, но прошло около трех лет с момента публикации вопроса, и в наши дни есть намного лучшие способы проверить вашу иерархию просмотров. -recursiveDescription
всегда был немного неуправляемым с большими иерархиями - вы потратили больше времени на просмотр вашего выходного журнала, чем потратили на программирование!
Вот некоторые новые решения:
Вы можете использовать DCIntrospect распечатать свойство зрения иерархии и вида, и получить некоторые интересные экранные маркера отладки.
Вы можете использовать Spark Inspector , чтобы увидеть вид вашего приложения иерархию и взаимодействовать с ним в 3D. Spark Inspector имеет боковую панель, которая отображает интерфейс Builder, и вы можете настроить ваши представления во время работы вашего приложения .(Полное раскрытие: Я являюсь ведущим разработчиком этого инструмента, пришлите мне ваши пожелания!)
Вы можете использовать PonyDebugger для подключения в Chrome инспектора в приложении - вы можете просматривать приложения view иерархии в представлении DOM, и они также захватывают сетевой трафик, который может быть полезен.
+1 на Spark Inspector. Позволяет мне быстро выявлять оскорбительные взгляды – SwiftArchitect
Вам не нужно писать ни о журнале или изменить код на всех.
Нажмите кнопку паузы.
Введите следующую команду в консоли
po [[UIWindow keyWindow] recursiveDescription]
В качестве ярлыка это доступно с помощью команды 'pviews' в библиотеке отладки Facebook [Chisel] (https://github.com/facebook/chisel). – bcattle
- 1. Сбросить иерархию представлений iOS
- 2. Мне нужно проверить Java
- 3. Только исходный поток, создавший иерархию представлений, может коснуться его представлений.
- 4. Только исходный поток, создавший иерархию представлений, может коснуться его представлений.
- 5. Как правильно изменить иерархию диспетчера представлений?
- 6. Как изменить иерархию представлений на моем мобильном телефоне Android?
- 7. Мне нужно проверить диапазон смешанной подстроки
- 8. Мне нужно что-то проверить, изменив vimrc
- 9. ли мне всегда нужно проверить переменных запроса
- 10. В Xamarin.Forms мне нужно удалить обработчики событий из представлений?
- 11. Когда мне нужно проверить свойство origin?
- 12. Мне нужно проверить, переопределен ли метод
- 13. Мне нужно проверить строку запроса в asp.net
- 14. Мне нужно проверить SSN очень определенным образом
- 15. Когда мне нужно проверить переполнение целых чисел?
- 16. Только исходный поток, создавший иерархию представлений, может коснуться его представлений. На андроид
- 17. Достаточно Regex, или мне нужно проверить кодировку?
- 18. Мне нужно проверить формат времени AM | PM
- 19. Нужно ли мне проверить Thread.isAlive() здесь?
- 20. Мне нужно проверить, что идентификатор сотрудника уникален
- 21. Мне нужно проверить равенство с оператором switch
- 22. Мне нужно проверить флажок в таблице флажков
- 23. Каким образом можно добавить контроллер представления в иерархию представлений?
- 24. Мне нужно проверить этот сайт на всем мобильном устройстве
- 25. Чтобы просто показать точку на карте, мне нужно проверить соединение?
- 26. Как проверить, нужно ли мне выполнять «nodetool upgradestables» на узле?
- 27. Мне нужно проверить, являются ли соседние позиции на плате «путями»
- 28. Мне нужно проверить, указывает ли указатель на функцию math.h
- 29. Только оригинальная тема, которая создала иерархию представлений, может коснуться ее представлений - Android
- 30. Только исходный поток, создавший иерархию представлений, может коснуться его представлений. Нет runnable
Это решение делает то, что я просил. Интересная часть всегда пытается задать правильный вопрос. – Chris
Я замечаю некоторые дополнительные подпрограммы в иерархии представлений между viewDidLoad и viewDidAppear. Я не добавляю никакого подсмотра в мой просмотр программно. Как это могло произойти, когда вся иерархия представлений уже существует в файле nib? Думаю, в этом случае оба viewDidLoad и viewDidAppear должны печатать одну и ту же иерархию представлений, но это не то, что я наблюдаю. – SayeedHussain