Мне нужно проверить иерархию представления в программе iPhone - PullRequest
22 голосов
/ 26 февраля 2010

Как определить структуру представления в моей программе iPhone во время работы на симуляторе?

Ответы [ 7 ]

61 голосов
/ 14 июня 2011

Существует встроенный способ вывести иерархию представлений: 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

29 голосов
/ 07 ноября 2013

Вам не нужно писать ни одного оператора журнала или вообще изменять свой код.

Нажмите кнопку паузы.

enter image description here

Введите в консоль следующее

po [[UIWindow keyWindow] recursiveDescription]
17 голосов
/ 02 июня 2013

Все эти ответы являются вариантами -recursiveDescription, но прошло уже три года с тех пор, как вопрос был опубликован, и в наши дни есть гораздо лучшие способы проверить вашу иерархию представлений. -recursiveDescription всегда было немного неуправляемо с большими иерархиями - вы бы потратили больше времени на просмотр выходного журнала, чем на программирование!

Вот несколько новых решений:

  • Вы можете использовать DCIntrospect , чтобы распечатать иерархию представления и просмотреть свойства и получить интересные маркеры отладки на экране.

    DCIntrospect View

  • Вы можете использовать Spark Inspector чтобы увидеть иерархию представления вашего приложения и взаимодействовать с ним в 3D. Spark Inspector имеет боковую панель, которая отражает Interface Builder, и вы можете настроить ваши взгляды, пока ваше приложение работает. (Полное раскрытие: я Я являюсь ведущим разработчиком этого инструмента - пришлите мне ваши пожелания!)

    Spark Inspector Main Panel

  • Вы можете использовать PonyDebugger для подключения Chrome Inspector для вашего приложения - вы можете просмотреть вид вашего приложения иерархия в представлении DOM, и они также захватывают сетевой трафик, что может быть полезно.

    PonyDebugger Web View

10 голосов
/ 26 февраля 2010

В соответствии с тем, что предлагает Янник, у Эрики Садун есть код здесь , который красиво печатает иерархию представления (с информацией о классе и кадре). Вы можете сделать это в категорию 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
5 голосов
/ 07 марта 2013

Попробуйте эту магию:

NSLog(@"%@", [self.view recursiveDescription]);
3 голосов
/ 26 февраля 2010

Вы можете использовать такой алгоритм, как этот:

-(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:@""];
}

источник: просмотр иерархии

1 голос
/ 13 января 2012

Я также имел дело с этой проблемой, и я придумал единственный рекурсивный метод в качестве категории в UIView. Он использует только базовые классы Foundation, поэтому он не такой сложный, как решение Эрики.

Вот метод категории:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...