答案 0 :(得分:2)
要控制焦点引擎,您必须覆盖UIFocusEnvironment
和/或相关UITableViewDelegate
和UICollectionViewDelegate
方法提供的方法。这与控制所选行/项目之类的行为大不相同,因为它是一个全局系统,而不是特定于特定视图。
在您的特定情况下,实施indexPathForPreferredFocusedViewInTableView(_:)
上可用的UITableViewDelegate
方法可能就足够了(请注意UICollectionViewDelegate
有一种等效的方法)。
尝试做类似事情时遇到的一个问题是首选焦点视图的默认链如何工作。最后我注意到the documentation for UIFocusEnvironment
的这一部分(所有视图和视图控制器都符合):
默认情况下,UIView返回自身,UIViewController返回它 根视图。在可聚焦视图中返回self表示该视图 应该集中精力。在一个不可聚焦的视图中回归自我导致了 通过查找,焦点引擎选择默认的首选焦点视图 最近的可聚焦子视图到屏幕的顶部前角。 返回nil表示没有首选的焦点视图。
在我的情况下,这意味着焦点引擎正在选择默认的首选焦点视图,并且我的UICollectionView
的焦点相关委托方法没有像我预期的那样被调用。如果您发现这种情况,您可能需要在视图控制器子类上实现preferredFocusedView
(在UIFocusEnvironment
协议中定义)并返回UITableView
的实例,以便委托方法与焦点被可靠地调用。
答案 1 :(得分:0)
使用TVML,它是属性{{1}} (https://developer.apple.com/library/tvos/documentation/LanguagesUtilities/Conceptual/ATV_Template_Guide/TVJSAttributes.html)
不适用于所有模板,但系统中似乎仍然存在一些错误。
答案 2 :(得分:0)
第一件事,
override var preferredFocusEnvironments: [UIFocusEnvironment] {
return [myTableView]
}
func indexPathForPreferredFocusedView(in tableView: UITableView) -> IndexPath? {
if focusAtIndexPathRow != -1 {
return IndexPath(item: focusAtIndexPathRow, section: 0)
} else {
return IndexPath(item: 0, section: 0)
}
}