有没有办法在Swift中使用[self.view recursiveDescription]?我正在尝试使用这个方法,但是我遇到以下错误:
'UIView' does not have a member named 'recursiveDescription'
有什么建议吗?
有没有办法在Swift中使用[self.view recursiveDescription]?我正在尝试使用这个方法,但是我遇到以下错误:
'UIView' does not have a member named 'recursiveDescription'
有什么建议吗?
(lldb)
提示下使用以下命令:po [[UIWindow keyWindow] recursiveDescription]
expr -l objc++ -O -- [[UIWindow keyWindow] recursiveDescription]
po [UIViewController _printHierarchy]
expr -l objc++ -O -- [UIViewController _printHierarchy]
poc
来远离这个复杂的expr
语法,方法是创建一个名为~/.lldbinit
的文本文件,并添加以下行:command alias poc expression -l objc -O --
poc [UIViewController _printHierarchy]
recursiveDescription
的需求。 (这在WWDC 2016视频使用Xcode进行可视化调试中讨论过(不再可用)。诚然,有时我们会不得不回到上面展示的recursiveDescription
技术,但大多数情况下,视图调试器使这个过程更加自然,直观。
而在Xcode 9中,他们扩展了这个视图调试器,现在也包括相关的视图控制器:
NSLog
或print
。 expr
将为您打印表达式。 其次,并回答您的问题,我不知道为什么在使用Objective-C时无法引用self
,而在Swift框架中(反之亦然),但这似乎也不奇怪。 显然,在使用[[UIWindow keyWindow] recursiveDescription]
或[UIViewController _printHierarchy]
时,您根本不需要引用self
,因此这不是问题,但这是一个有趣的观察。 - Robpo self.foo.bar.someView
),在Swift中打印视图对象有时更容易,以获取其地址。您将获得类似于 <UIView: 0x10bd0a600; …>
的输出。使用该地址,您可以使用Rob的技巧转储层次结构,如下所示:expr -l objc++ -O -- [0x10bd0a600 recursiveDescription]
。 - DarkDustpo view.performSelector("recursiveDescription")
po let s = view.perform("recursiveDescription"); print(s)
po view.value(forKey: "recursiveDescription")!
UIView
上的-recursiveDescription
方法),从Swift中可以执行以下操作:
UIView
)上创建一个新的Objective-C分类。在分类头文件中声明私有方法:
// UIView+Debugging.h
@interface UIView (Debugging)
- (id)recursiveDescription;
@end
现在您可以在LLDB中设置断点并打印递归描述: 现在您可以在 LLDB 中设置断点并打印递归描述:
po view.recursiveDescription() as NSString
首先在你的桥接头文件中添加一个没有@implementation
的类别 @interface
。
@interface UIView (Debug)
- (id)recursiveDescription;
- (id)_autolayoutTrace; // This one is even sweeter
@end
在您的控制台中执行以下命令:
po self.recursiveDescription() as NSString
po self._autolayoutTrace() as NSString
as NSString
而非 as String
。expression -l objc -O -- [`self.view` recursiveDescription]
[`self.view`]
反引号就像一个预处理步骤,它首先在当前框架中评估其内容并插入结果,然后我们可以评估其余部分。
我的答案来自于WWDC 2018 Session 412高级调试与Xcode和lldb。
在桥接头文件中添加一个UIView类别的声明,该类别具有该方法。
在@Rob Mayoff的答案基础上进行扩展:
extension UIView {
/**
Wrapper for useful debugging description of view hierarchy
*/
var recursiveDescription: NSString {
return value(forKey: "recursiveDescription") as! NSString
}
}