是否有视图控制器层次结构的recursiveDescription方法?

时间:2013-01-07 10:07:06

标签: objective-c ios uiviewcontroller

调试视图层次结构时,

recursiveDescription非常有用。查看控制器层次结构也非常重要,是否有相应的内容?

4 个答案:

答案 0 :(得分:32)

为了简明扼要地回答,我在Xcode的调试器控制台中使用以下命令来打印视图控制器层次结构:

po [[[UIWindow keyWindow] rootViewController] _printHierarchy]

P.S。这仅适用于ios8及更高版本,仅用于调试目的。

链接到帮助我发现这一点的文章以及许多其他出色的调试技术this

编辑1: 在Swift 2中,您可以通过以下方式打印层次结构:

UIApplication.sharedApplication().keyWindow?.rootViewController?.valueForKey("_‌​printHierarchy")

编辑2: 在Swift 3中,您可以通过以下方式打印层次结构:

UIApplication.shared.keyWindow?.rootViewController?.value(forKey: "_printHierarchy")

答案 1 :(得分:17)

更新 - 类似的功能现在可以在Apple提供的表单中以_printHierarchy方式提供,因此您不再需要此类别。

现在有:

Github: Recursive description category for view controllers

这会向recursiveDescription添加UIViewController方法,该方法会打印出视图控制器层次结构。非常适合检查您是否正确添加和删除子视图控制器。

代码非常简单,包括在这里以及上面的GitHub链接:

@implementation UIViewController (RecursiveDescription)

-(NSString*)recursiveDescription
{
    NSMutableString *description = [NSMutableString stringWithFormat:@"\n"];
    [self addDescriptionToString:description indentLevel:0];
    return description;
}

-(void)addDescriptionToString:(NSMutableString*)string indentLevel:(NSInteger)indentLevel
{
    NSString *padding = [@"" stringByPaddingToLength:indentLevel withString:@" " startingAtIndex:0];
    [string appendString:padding];
    [string appendFormat:@"%@, %@",[self debugDescription],NSStringFromCGRect(self.view.frame)];

    for (UIViewController *childController in self.childViewControllers)
    {
        [string appendFormat:@"\n%@>",padding];
        [childController addDescriptionToString:string indentLevel:indentLevel + 1];
    }
}

@end

答案 2 :(得分:7)

最快的方法(在lldb / Xcode调试器中):

_ide_helper.php

答案 3 :(得分:1)

_printHierarchy没有为VC视图的子视图组件提供递归信息。

方法1:使用lldb命令获取完整的视图层次结构。

po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]

方法2:使用XCode调试器中的“Debug View Hierarchy”按钮获取所有信息的最佳方法。

enter image description here