tvOS - 在 Table 视图中聚焦特定项目

tvOS - Focus particular item in a Table View

tvOS 开发中 - 默认情况下 table 视图的焦点是第一项。但是,如何在 Table 视图中默认聚焦特定项目。

例如,默认情况下,我想聚焦 table 视图的第 n 行。

提前感谢您的帮助。

对于 TVML,它是属性 autoHighlight="true" (https://developer.apple.com/library/tvos/documentation/LanguagesUtilities/Conceptual/ATV_Template_Guide/TVJSAttributes.html)

并非所有模板都适用,但系统中似乎仍存在一些错误。

通常要控制焦点引擎,您必须覆盖 UIFocusEnvironment and/or 相关的 UITableViewDelegateUICollectionViewDelegate 方法提供的方法。这与控制诸如选定 row/item 之类的东西有很大不同,因为它是一个全局系统,而不是特定于特定视图。

在您的特定情况下,实施 UITableViewDelegate 上可用的 indexPathForPreferredFocusedViewInTableView(_:) 方法可能就足够了(请注意,UICollectionViewDelegate 有一个等效方法)。

我 运行 在尝试做类似的事情时遇到的一个问题是首选焦点视图的默认链是如何工作的。最终我注意到 the documentation for UIFocusEnvironment 的这一部分(所有视图和视图控制器都符合):

By default, UIView returns itself and UIViewController returns its root view. Returning self in a focusable view indicates that view should be focused. Returning self in an unfocusable view causes the focus engine to pick a default preferred focused view, by finding the closest focusable subview to the top-leading corner of the screen. Returning nil indicates that there is no preferred focused view.

在我的例子中,这意味着焦点引擎正在选择一个默认的首选焦点视图,并且我的 UICollectionView 的焦点相关委托方法没有像我预期的那样被调用。如果你发现是这种情况,你可能需要在你的视图控制器子类和 return 你的 UITableView 实例上实现 preferredFocusedView(在 UIFocusEnvironment 协议中定义),以便与焦点相关的委托方法得到可靠调用。

首先,

  1. 在视图加载期间,设置:
override var preferredFocusEnvironments: [UIFocusEnvironment] {
        return [myTableView]
    }
  1. 要专注于特定的 IndexPath,
func indexPathForPreferredFocusedView(in tableView: UITableView) -> IndexPath? {
        if focusAtIndexPathRow != -1 {
            return IndexPath(item: focusAtIndexPathRow, section: 0)
        } else {
            return IndexPath(item: 0, section: 0)
        }
    }