一直在挖掘documentation,但我似乎无法找到完成以下任务的方法。
我的SplitViewController
加载UITableView
作为主人,但是我可以直接向右滑动Apple TV遥控器进入详情视图。如何禁用此手势,以便我可以在只在主视图中进行选择后启用详细信息视图?
从文档中,var presentsWithGesture: Bool
听起来是正确的事情,但这仅适用于已隐藏的视图。我的视图并排显示,两者都可见。有什么想法吗?
答案 0 :(得分:3)
您可以在主视图控制器上创建一个属性,以便跟踪是否要在焦点视图控制器中进行焦点,例如:
var presentDetail = false
然后你应该覆盖shouldUpdateFocusInContext
以不允许焦点更新向右移动。
override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool {
if context.focusHeading == .Right { return false }
return super.shouldUpdateFocusInContext(context)
}
接下来,您需要覆盖preferredFocusedView
:
override var preferredFocusedView: UIView?{
if self.presentDetail {
self.presentDetail = false
guard let vc = self.splitViewController?.viewControllers[1] else { return nil }
return vc.view
}
return self.tableView
}
通常我们会返回我们的tableView,但是当我们想要将焦点转移到详细视图控制器时,我们将返回它的视图。
最后,我们实施didSelectRowAtIndexPath
:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let vc = self.splitViewController?.viewControllers[1] {
self.presentDetail = true
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
vc.setNeedsFocusUpdate()
vc.updateFocusIfNeeded()
}
}
我们在主视图控制器和详细视图控制器上请求更新焦点引擎。