30

recursiveDescription在调试视图层次结构时非常有用。视图控制器层次结构也很重要,有没有等价的?

4

4 回答 4

43

简而言之,我在 Xcode 的调试器控制台中使用以下命令来打印视图控制器层次结构:

po [[[UIWindow keyWindow] rootViewController] _printHierarchy]

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

链接到帮助我发现这个和许多其他出色的调试技术的文章是这个

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

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

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

UIApplication.shared.keyWindow?.rootViewController?.value(forKey: "_printHierarchy")
于 2015-12-01T12:33:46.120 回答
18

更新- 类似的功能现在以 Apple 提供的形式作为_printHierarchy方法提供,因此您不再需要此类别。

现在有:

Github:视图控制器的递归描述类别

这添加了一个打印视图控制器层次结构的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
于 2013-01-07T10:07:05.907 回答
10

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

po [UIViewController _printHierarchy]
于 2016-06-22T19:08:47.273 回答
0

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

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

po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]

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

在此处输入图像描述

于 2016-11-06T07:56:26.770 回答