tvOS 上的 UISplitViewController - 禁用滑动到详细视图控制器

UISplitViewController on tvOS - Disable Swipe to Detail View Controller

一直在研究 documentation,但我似乎找不到完成以下任务的方法。

我的 SplitViewControllerUITableView 作为主设备加载,但我只需将 Apple TV 遥控器向右滑动即可进入详细视图。我如何才能禁用此手势,以便仅在主视图中进行选择后才启用详细视图?

根据文档,var presentsWithGesture: Bool 听起来是正确的做法,但这仅适用于已经隐藏的视图。我的视图并排显示,并且都可见。有什么想法吗?

您可以在主视图控制器上创建一个 属性 以跟踪您是否希望在详细视图控制器中获得焦点,例如:

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
}

通常我们会 return 我们的 tableView,但是当我们想将焦点转移到详细视图控制器时,我们会 return 它的视图。

最后我们实现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()
        }
    }

我们请求更新主视图控制器和详细视图控制器上的焦点引擎。