Debugging tvOS中是否有用于焦点引擎调试的隐藏工具?

Debugging tvOS中是否有用于焦点引擎调试的隐藏工具?,debugging,tvos,Debugging,Tvos,我最喜欢的iOS隐藏调试工具之一是在UIView实例上使用recursiveDescription。例如,这对于排除屏幕外视图位置的故障非常有用。在tvOS上调试Focus引擎带来了它自己的一系列挑战,特别是在它认为是可聚焦元素的方面 tvOS是否有任何隐藏的调试工具来反思Focus Engine内部的运行情况?有两种有用的方法,这两种方法实际上都在 UIView 如果您试图将焦点移动到特定视图,但无法移动,则UIView上有一种调试方法可以帮助解释原因:\u为什么此视图不可聚焦 此方法的输出如

我最喜欢的iOS隐藏调试工具之一是在
UIView
实例上使用
recursiveDescription
。例如,这对于排除屏幕外视图位置的故障非常有用。在tvOS上调试Focus引擎带来了它自己的一系列挑战,特别是在它认为是可聚焦元素的方面


tvOS是否有任何隐藏的调试工具来反思Focus Engine内部的运行情况?

有两种有用的方法,这两种方法实际上都在

UIView 如果您试图将焦点移动到特定视图,但无法移动,则
UIView
上有一种调试方法可以帮助解释原因:
\u为什么此视图不可聚焦

此方法的输出如下所示:

(lldb) po [(UIView *)0x148db5234 _whyIsThisViewNotFocusable]
ISSUE: This view has userInteractionEnabled set to NO. Views must allow user interaction to be focusable.
ISSUE: This view returns NO from -canBecomeFocused.
UIFocusUpdateContext
UIFocusUpdateContext
对象支持Xcode的QuickLook功能,因此如果在调试器中暂停,可以按空格键(或单击变量旁边的眼球图标)查看聚焦引擎所看到的图形表示(图像来自Apple文档):


自从tvOS 11以来,排除无法访问的项目变得容易多了,只需将此添加到相关ViewController的viewDidLoad中即可:

 if #available(tvOS 11.0, *) {
  NotificationCenter.default.addObserver(
    forName: NSNotification.Name.UIFocusMovementDidFail
  ) { [weak self] notification in
    let context = notification.userInfo![UIFocusUpdateContextKey] as! UIFocusUpdateContext
    print(context) // If you add a breakpoint here you can quicklook the context in the debugger for more information
    print(UIFocusDebugger.checkFocusability(for: self!.collectionView)) // replace collectionView with the view you want to check
  }
}
这将导致调试输出,如:

<UIFocusUpdateContext: 0x6080000fe800: previouslyFocusedItem=<UIKeyboard 0x7fc597d75610>, nextFocusedItem=(null), focusHeading=Down>

The following issues were found that would prevent this item from being focusable:
- ISSUE: The item is being visually occluded by the following items:
<UIView 0x7fc597c3a9e0>

发现以下问题会阻止此项目的聚焦:
-问题:该项目被以下项目遮挡:

并在swift 3:po myView中执行(选择器(“\u为什么此视图不可聚焦”)。执行未恢复值()检查