recursiveDescription
在调试视图层次结构时非常有用。视图控制器层次结构也很重要,有没有等价的?
问问题
10931 次
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
方法提供,因此您不再需要此类别。
现在有:
这添加了一个打印视图控制器层次结构的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 回答