@PeterOettl 对他自己的问题的回答让我走上了正确的道路,并且非常适合。所以功劳属于他。
我的故事板结构与他几乎相同,但由于vc 是navigationController,我收到运行时错误提示
'不支持推送导航控制器'
如前所述,那是因为vc 是详细视图的navigationController,而不是详细视图的 viewController。
请注意,我很惊讶@PeterOettl 在他的情况下也没有收到该错误,因为故事板图片中给出的 segue 指向详细视图的导航控制器。
因此代码应该像这样(在 Swift 中)只需添加
let detailViewControllerNavigationController = (vc as UINavigationController).viewControllers[0] as UIViewController
并推送detailViewControllerNavigationController 而不是vc
整个代码是
func splitViewController(splitViewController: UISplitViewController, showDetailViewController vc: UIViewController, sender: AnyObject?) -> Bool {
println("UISplitViewController collapsed: \(splitViewController.collapsed)")
if (splitViewController.collapsed) {
let master = splitViewController.viewControllers[0] as UITabBarController
let masterNavigationController = master.selectedViewController as UINavigationController
let detailViewControllerNavigationController = (vc as UINavigationController).viewControllers[0] as UIViewController
masterNavigationController.pushViewController(detailViewControllerNavigationController, animated: true)
return true
} else {
return false
}
}
另请注意,此代码放在 Xcode 主从示例的 AppDelegate.swift 中,其中在主视图中添加了一个标签栏。
编辑
在我们与 @PeterOettl 讨论的 cmets 中,.pushViewController 和 .showViewController 之间的区别。
Apple 文档说:
showViewController:sender:
这个方法推送一个新的视图控制器
以与
pushViewController:animated: 方法。可以直接调用这个方法
如果你愿意,但通常这个方法是从其他地方调用的
需要新视图控制器时的视图控制器层次结构
显示。
适用于 iOS 8.0 及更高版本。