你可以在你的主视图控制器上创建一个属性来跟踪你是否想把焦点放在细节视图控制器上,比如:
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()
}
}
我们请求更新主视图控制器和详细视图控制器上的焦点引擎。