从SplitViewController中的MasterViewController发送到另一个View Controller

时间:2015-05-11 11:09:11

标签: ios swift segue uisplitviewcontroller

我有一个SplitViewController,其中UITableViewController为masterViewController,UIViewController为detailViewController。

enter image description here

enter image description here

当用户点击一个单元格时,我需要推送到新的UITableViewController。所以我从单元格中添加了一个segue到UITableViewController。但是会发生什么是将UITableViewController添加到masterViewController的堆栈中。

enter image description here

如何从masterViewController推送到全新的UITableViewController

2 个答案:

答案 0 :(得分:3)

以下是我如何处理此类功能的简单示例(我创建了一个新的 Master-Detail应用程序):

<强>故事板: enter image description here

请注意,根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)
        }
    }
}

重要说明:

  1. 如果您从模板创建新的 MasterDetail应用程序,则必须断开showDetail segue,因为它直接链接到单元格selected回调。如果您想要保留该功能,只需再次连接它,而不是从单元本身连接,而是从整个VC连接。能够在我的时髦didSelect...方法中使用它,在偶数行上执行showDetail segue。

  2. Split View演示文稿只能运行一次 - 我还没有实现整个rootViewController替换 - lldb 会抱怨说:Attempt to present UISplitViewController on UINavigationController whose view is not in the window hierarchy!如果你试图做的话这是第二次。但这完全取决于您对应用程序行为的要求。

  3. 如果要像我在代码中一样呈现拆分视图控制器,请在Storyboard“SplitVC”(故事板ID)中命名SplitView控制器。

答案 1 :(得分:3)

我明白了!首先我应该提一下Michal的回答帮助我得到一个想法并指出我正确的方向,所以感谢他。

我做的很简单。在我有一个容器视图嵌入拆分视图控制器的View Controller之前。我只是继续将该视图控制器嵌入到导航控制器中。

enter image description here

然后我在故事板中添加了我想要的视图控制器,但没有附加到它的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,以防任何人感兴趣。