tvOS 上的 UISplitViewController - 禁用滑动到详细视图控制器
UISplitViewController on tvOS - Disable Swipe to Detail View Controller
一直在研究 documentation,但我似乎找不到完成以下任务的方法。
我的 SplitViewController
以 UITableView
作为主设备加载,但我只需将 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()
}
}
我们请求更新主视图控制器和详细视图控制器上的焦点引擎。
一直在研究 documentation,但我似乎找不到完成以下任务的方法。
我的 SplitViewController
以 UITableView
作为主设备加载,但我只需将 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()
}
}
我们请求更新主视图控制器和详细视图控制器上的焦点引擎。