swift - tvOS 上的 UISplitViewController - 禁用滑动到详细 View Controller

标签 swift uisplitviewcontroller tvos apple-tv

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

我的 SplitViewController 加载了一个 UITableView 作为主视图,但是我只需将 Apple TV Remote 向右滑动即可进入详细 View 。如何禁用此手势,以便仅在主视图中进行选择后才启用详细 View ?

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

最佳答案

你可以在你的主视图 Controller 上创建一个属性来跟踪你是否想关注细节 View Controller ,比如:

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 但当我们想将焦点转移到细节 View Controller 时我们会返回它的 View 。

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

我们请求更新主视图 Controller 和详细 View Controller 上的焦点引擎。

关于swift - tvOS 上的 UISplitViewController - 禁用滑动到详细 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38033187/

相关文章:

ios - 将 segue 添加到分割 View Controller

uibutton - 如何为 tvOS 创建一个具有背景颜色的按钮,同时仍显示焦点?

swift - 如何从 Swift 中的字符串中删除单引号?

swift - 更改用户默认 bool Swift 的默认值

ios - 在启动时显示主视图,在 "slide over"上显示详细 View

ios - UISplitViewController 始终在 iPad 纵向模式 iOS 9 中显示主视图

swift - UITextView 滚动在 tvOS 上反转

ios - NSURL 请求不起作用

ios - 从扬声器获取音频样本

ios - 如何使用 SocketIO 订阅套接字 channel ?