Подтвердить что ты не робот

Мне нужно проверить иерархию представлений в программе iPhone

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

4b9b3361

Ответ 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

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

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

enter image description here

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

po [[UIWindow keyWindow] recursiveDescription]

Ответ 4

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

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

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

    DCIntrospect View

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

    Spark Inspector Main Panel

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

    PonyDebugger Web View

Ответ 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/