2013-01-07 95 views

回答

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 
+1

+1.5發揮得好,先生。 – Caleb

23

簡明把答案,我用命令低於Xcode的調試器控制檯打印視圖控制器層次:

po [[[UIWindow keyWindow] rootViewController] _printHierarchy] 

PS這僅適用於ios8及更高版本,僅用於調試目的。

的文章鏈接,幫助我發現這和其他許多輝煌的調試技術是this

編輯1: 在斯威夫特2,你可以通過打印層次:

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

編輯2: 在Swift 3中,您可以通過以下方式打印層次結構:

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

在Swift中:'UIApplication.sharedApplication().keyWindow?.rootViewController?.valueForKey(「_ printHierarchy」)' –

+0

謝謝。我會將其添加到答案中。 – jarora

5

最快方法(在LLDB/Xcode調試):

po [UIViewController _printHierarchy] 
0

_printHierarchy不提供用於VC的視圖的子視圖分量遞歸信息。

方法1:使用lldb命令獲取完整的視圖層次結構。

po [[[UIApplication sharedApplication] keyWindow] recursiveDescription] 

方法二:利用Xcode調試「調試視圖層次」按鈕最好的辦法讓所有的信息。

enter image description here

+0

嗯,這很好,但問題明確提到recursiveDescription,我正在尋找一個等效的視圖控制器層次結構。 – jrturton

相關問題