【发布时间】:2016-02-25 08:18:04
【问题描述】:
【问题讨论】:
标签: objective-c uitableview tvos
【问题讨论】:
标签: objective-c uitableview tvos
一般来说,要控制焦点引擎,您必须覆盖UIFocusEnvironment 提供的方法和/或相关的UITableViewDelegate 和UICollectionViewDelegate 方法。这与控制所选行/项目之类的东西有很大不同,因为它是一个全局系统,而不是特定于特定视图。
在您的特定情况下,实现UITableViewDelegate 上可用的indexPathForPreferredFocusedViewInTableView(_:) 方法可能就足够了(请注意,UICollectionViewDelegate 有一个等效方法)。
我在尝试做类似的事情时遇到的一个问题是首选焦点视图的默认链是如何工作的。最终我注意到the documentation for UIFocusEnvironment 的这一部分(所有视图和视图控制器都符合):
默认情况下,UIView 返回自己,UIViewController 返回自己的 根视图。在可聚焦视图中返回 self 表示该视图 应该是重点。在无法聚焦的视图中返回 self 会导致 焦点引擎选择默认的首选焦点视图,通过查找 最靠近屏幕顶部的可聚焦子视图。 返回 nil 表示没有首选的焦点视图。
在我的情况下,这意味着焦点引擎正在选择默认的首选焦点视图,并且我的 UICollectionView 的焦点相关委托方法没有像我预期的那样被调用。如果您发现这种情况,您可能需要在您的视图控制器子类上实现preferredFocusedView(在UIFocusEnvironment 协议中定义)并返回您的UITableView 实例,以便可靠地调用与焦点相关的委托方法。
【讨论】:
对于 TVML,它是属性 autoHighlight="true"
(https://developer.apple.com/library/tvos/documentation/LanguagesUtilities/Conceptual/ATV_Template_Guide/TVJSAttributes.html)
虽然不适用于所有模板,但系统中似乎仍然存在一些错误。
【讨论】:
第一件事,
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)
}
}
【讨论】: