我有一个SplitViewController
,其中UITableViewController
为masterViewController,UIViewController
为detailViewController。
当用户点击一个单元格时,我需要推送到新的UITableViewController
。所以我从单元格中添加了一个segue到UITableViewController
。但是会发生什么是将UITableViewController
添加到masterViewController的堆栈中。
如何从masterViewController推送到全新的UITableViewController
?
答案 0 :(得分:3)
以下是我如何处理此类功能的简单示例(我创建了一个新的 Master-Detail应用程序):
<强>故事板:强>
请注意,根VC现在是UINavigationController
。因此,AppDelegate
必须相应更改:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let navCtr = self.window!.rootViewController as UINavigationController
let splitViewController = navCtr.visibleViewController as UISplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as UINavigationController
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
splitViewController.delegate = self
return true
}
最后在MasterViewController
添加此内容:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
if indexPath.row % 2 == 0 {
self.performSegueWithIdentifier("showDetail", sender: nil)
} else {
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
if let let rootCtr = appDelegate.window?.rootViewController {
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let newSplit = storyboard.instantiateViewControllerWithIdentifier("SplitVC") as UISplitViewController
/// Because of Apple's "Split View Controllers cannot be pushed to a Navigation Controller"
let yetAnotherNavCtr = UINavigationController(rootViewController: newSplit)
rootCtr.presentViewController(newSplit, animated: true, completion: nil)
}
}
}
重要说明:
如果您从模板创建新的 MasterDetail应用程序,则必须断开showDetail
segue,因为它直接链接到单元格selected
回调。如果您想要保留该功能,只需再次连接它,而不是从单元本身连接,而是从整个VC连接。能够在我的时髦didSelect...
方法中使用它,在偶数行上执行showDetail
segue。
Split View演示文稿只能运行一次 - 我还没有实现整个rootViewController替换 - lldb 会抱怨说:Attempt to present UISplitViewController on UINavigationController whose view is not in the window hierarchy!
如果你试图做的话这是第二次。但这完全取决于您对应用程序行为的要求。
如果要像我在代码中一样呈现拆分视图控制器,请在Storyboard
“SplitVC”(故事板ID)中命名SplitView控制器。
答案 1 :(得分:3)
我明白了!首先我应该提一下Michal的回答帮助我得到一个想法并指出我正确的方向,所以感谢他。
我做的很简单。在我有一个容器视图嵌入拆分视图控制器的View Controller之前。我只是继续将该视图控制器嵌入到导航控制器中。
然后我在故事板中添加了我想要的视图控制器,但没有附加到它的segue。我是在masterViewController的didSelectRowAtIndexPath方法中以编程方式进行的。
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
if let rootVC = appDelegate.window?.rootViewController {
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let mapVC = storyboard.instantiateViewControllerWithIdentifier("MapVC") as! UIViewController
rootVC.showViewController(mapVC, sender: nil)
}
我得到了一个对rootViewController的引用,它是一个通过AppDelegate的导航控制器,我将我想要的新视图控制器推送到它的堆栈。
那就是它!这是一个演示project,以防任何人感兴趣。