如何从主视图控制器中推送详细视图控制器中的新视图?

时间:2016-06-04 22:42:48

标签: ios swift uiviewcontroller uinavigationcontroller

我一直在试图弄清楚如何做到这一点。如果有人有一些见解,将不胜感激。我试图使用segues和push / presentViewController方法来做到这一点。使用pushViewController没有任何反应。

场景:拆分视图控制器连接了两个导航控制器(一个作为主控,一个作为细节)。主人的导航控制器有一个带有各种单元格的表格,可以在iPad上以横向模式控制右侧详细视图中显示的内容。连接到详细视图的导航控制器具有连接到它的故事板引用(其中3个)。

我想做什么:从主视图控制器(应用程序菜单),我想在维护导航栏的同时控制详细视图中显示的内容。

尝试1:

let detailVC = self.splitViewController!.viewControllers[1]
let newVC = UIStoryboard(name: "D", bundle: nil).instantiateViewControllerWithIdentifier("P")
detailVC.self.navigationController?.pushViewController(newVC, animated: true)

尝试2:

let detailVC = self.splitViewController!.viewControllers[1]
let newVC = UIStoryboard(name: "D", bundle: nil).instantiateViewControllerWithIdentifier("P")
detailVC.performSegueWithIdentifier("navP", sender: self)

我遇到的另一个相关问题...如果用户在多个菜单选项之间进行了多次跳转,那么如何在导航栏中“重置”后退按钮的历史记录以防止点击后退将使您完成循环的情况相同的几个观点?

2 个答案:

答案 0 :(得分:0)

你不应该推动视图控制器或执行segue而是调用showViewController。

您是否确实需要维护导航栏或者是否可以显示不同的UINavigationBars(通过显示嵌入在UINavigationViewController中的视图控制器)?

或者只显示一个视图控制器,并使用您在视图控制器中添加的逻辑来更改主视图控制器控制下的内容。

答案 1 :(得分:0)

经过一些实验,我解决了这个问题。 :)以下解决方案适用于所有设备(iPhone / iPad)。

定义UISplitViewController的扩展名:

基于https://stackoverflow.com/users/4418308/santiago-bendavid的修改版

extension UISplitViewController {
    func toggleMasterView() {
        if UIScreen.mainScreen().bounds.height > UIScreen.mainScreen().bounds.width {
            var nextDisplayMode: UISplitViewControllerDisplayMode
            switch(self.preferredDisplayMode){
            case .PrimaryHidden:
                nextDisplayMode = .AllVisible
            default:
                nextDisplayMode = .PrimaryHidden
            }
            UIView.animateWithDuration(0.2) { () -> Void in
                self.preferredDisplayMode = nextDisplayMode
            }
        } else {
            // do nothing
        }
    }
}

主导航控制器的根视图控制器中的代码:

let newVC = UIStoryboard(name: "some_storyboard_id", bundle: nil).instantiateInitialViewController()
if self.splitViewController!.viewControllers.count == 2 {
    let detailVC = self.splitViewController!.viewControllers[self.splitViewController!.viewControllers.endIndex - 1]
    if detailVC.childViewControllers[detailVC.childViewControllers.count - 1].restorationIdentifier! != "some_id_here" { 
        detailVC.childViewControllers[0].navigationController?.pushViewController(newVC!, animated: true)
    }
    self.splitViewController!.toggleMasterView()                
    self.navigationController?.splitViewController!.preferredDisplayMode = .Automatic
} else {
    self.navigationController?.pushViewController(newVC!, animated: true)
}

此代码适用于常规iPhone(非Plus),其中主视图控制器是用于导航的唯一控制器。在iPad和iPhone 6 / 6s +型号上(其行为与iPad相同)我使用恢复ID属性检查当前视图是否已存在,然后显示新视图(如果它与已经不同的视图)如果我们处于纵向模式,则在屏幕上呈现并关闭主视图控制器。如果是横向,我们将其保留在屏幕上(默认行为)。