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

时间:2016-06-25 21:37:37

标签: swift uisplitviewcontroller tvos apple-tv

一直在挖掘documentation,但我似乎无法找到完成以下任务的方法。

我的SplitViewController加载UITableView作为主人,但是我可以直接向右滑动Apple TV遥控器进入详情视图。如何禁用此手势,以便我可以在只在主视图中进行选择后启用详细信息视图?

从文档中,var presentsWithGesture: Bool听起来是正确的事情,但这仅适用于已隐藏的视图。我的视图并排显示,两者都可见。有什么想法吗?

1 个答案:

答案 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()
        }
    }

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