如何检查iOS中的视图层次结构?


170

是否有用于检查iOS应用程序视图层次结构的GUI工具?我在考虑Webkit的Web检查器或类似工具。我正在寻找调试布局问题的方法,例如视图或位置或大小错误,或者子项未正确包含在其父项中。当前,我必须添加断言来手动测试这些各种条件,或者在不同的视图上设置不同的背景颜色,并且可以想象,这是一种非常繁琐的解决方法。

我查看了Instruments的UI recorder,但它仅记录和播放UI操作`,并且在任何情况下仅适用于Mac应用。

有更好的解决方案吗?

Answers:


168

Xcode 6现在内置了3D视图层次结构检查功能,例如Reveal App和Spark Inspector。

在此处输入图片说明

在您的应用运行时,单击“调试视图层次结构”按钮以暂停执行并在当前时刻检查视图。

在此处输入图片说明

有关更多信息,请参阅Apple的文档


5
如果视图调试选项不可用,请参阅stackoverflow.com/questions/24040322/…
kennytm 2014年

最初,我没有看到Levi McCallum所显示的工具栏,因为如果应用程序没有任何调试输出,它就位于Xcode窗口的最底部。按下按钮后,“查看层次结构”窗口将变为空白,直到我按下底部的按钮之一或调整其中一个滑块为止。
卡尔·史密斯

一旦您开始依赖此工具,它总是会崩溃。我不知道为什么或如何解决它,但它似乎发生在更复杂的视图上。
Departamento B,

263

我不知道是否有GUI视图检查工具,但是我对UIView上的调试方法有些幸运: -recursiveDescription

如果您在调试器中暂停程序并将其输入到GDB中(编辑:在LLDB中也有效)

po [[UIWindow keyWindow] recursiveDescription]

您将获得整个视图层次结构的打印输出。您还可以在特定视图上调用它,以获取该视图的视图层次结构的打印输出。

遍历您从中获得的信息可能有点乏味,但事实证明对我有用。

值得一提的是这篇博客该博客讨论了这种方法,并与此有用的链接有关,但是很难找到Apple技术说明


1
我得到:错误:找不到'$ __ lldb_objc_class'的接口声明有什么想法?(lldb)po [[UIWindow keyWindow] recursiveDescription]错误:找不到'$ __ lldb_objc_class'的接口声明错误:找不到'$ __ lldb_objc_class'的接口声明错误:2个解析表达式的错误
Zennichimaro

1
我相信这个答案不再是规范的答案,因为现在有可用的GUI工具直接回答“是否有GUI工具...?”这个问题。
theraven

从xcode 5.1开始,每当我键入recursiveDescription时,我都开始出现此错误:错误的实例方法'undoManager'在不同的翻译单元中具有不兼容的结果类型('id'与'NSUndoManager *')注:实例方法'undoManager'在此也声明错误:解析表达式时发生1个错误
2014年

1
虽然这个问题很古老,并且询问图形方法,但是这个特定的答案与文本解决方案有关。规范内编码解决方案的讨论可以在以下位置找到:stackoverflow.com/a/14193682/2431627。即通过KVC使用_printHierarchy属性。
罗宾·马查格

46

显示应用截图

奇怪的是,现在还有另一个选项http://revealapp.com/,截止本文发布时,该选项处于开放(免费)测试版中。如您所见,它是另一个视觉检查器。

编辑2014-04-05:Reveal已超出Beta,并且不再免费。但是,有30天的试用期。


1
我已经尝试了一些工具(Spark Inspector,iOS Hierarchy Viewer和Frank测试工具中类似firebug的视图)。到目前为止,Reveal是我的最爱。

1
但是总还是值得的。比查看视图的内置Xcode工具好得多
Will Larche 2014年

35

这个问题很旧,但是让我在这里将有关我开发的新工具的信息放到这里:https : //github.com/glock45/iOS-Hierarchy-Viewer 在此处输入图片说明


在模拟器中导航到另一个视图时,是否可以自动刷新页面?此外,是否可以在此查看器中更改值(因此我可以在浏览器中进行一些测试而无需编写实际代码)?谢谢:)
布莱恩

1
@布莱恩谢谢大脑。我开始原型化更改值的可能性。在正式版本中已关闭。敬请关注 !
DamianKołakowski13年

非常感谢您的建议。我设法用这个工具解决了我的问题,而使用Xcode的UI调试器无法解决这个问题!
D6mi '16

谢谢,达米安(Damian),但对于阅读此书的人们来说,此工具似乎无法维护。
Vaddadi Kartick



6

免费:只需在检查器中输入以下内容:

po [[UIWindow keyWindow] recursiveDescription]

商业版:http : //revealapp.com/我测试了揭示版的beta版本,虽然有错误,但是很好。另一个商业工具:http : //sparkinspector.com/,它可以无缝运行。


Spark Inspector有一个很好的通知查看器
thierryb 2014年

6

迅捷4。

iOS

extension UIView {

   // Prints results of internal Apple API method `recursiveDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("recursiveDescription"))))
   }
}

macOS

extension NSView {

   // Prints results of internal Apple API method `_subtreeDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("_subtreeDescription"))))
   }
}

用法(在调试器中): po myView.dump()


2

这会将所有内容转储到调试窗口中。(很难阅读):(在iOS 10上运行,Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()

0

使用Xcode 8和Swift 2.3 ,已批准的答案不再对我有用。这对我有用:

po UIApplication.sharedApplication().keyWindow?.recursiveDescription()


1
谢谢,英里,但是这并不无论是在斯威夫特3工作:错误:“共享”属性不是类型的“UIApplication的”对象发现
Vaddadi Kartick

Swift 4和Xcode 9.1抱怨“错误:<EXPR>:3:32:错误:无法调用非函数类型'UIApplication'的值UIApplication.sharedApplication()。keyWindow?.recursiveDescription()”
Jason Harrison

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.