【问题标题】:UISplitViewController on tvOS - Disable Swipe to Detail View ControllertvOS 上的 UISplitViewController - 禁用滑动到详细视图控制器
【发布时间】:2016-06-25 21:37:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: swift uisplitviewcontroller tvos apple-tv


    【解决方案1】:

    你可以在你的主视图控制器上创建一个属性来跟踪你是否想把焦点放在细节视图控制器上,比如:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      相关资源
      最近更新 更多