从非活动的Uiviewcontroller(以编程方式)推送到新的Viewcontroller

时间:2015-04-04 09:38:46

标签: ios swift uiviewcontroller menu uicontainerview

简短说明。

我有一个ContainerViewController,我正在推送到navigationStack。

ContainerViewController有2个子ViewControllers。 SlidePanelViewController(幻灯片菜单)和CenterViewController(内容)

我的菜单中有一个按钮“退出”。点击此按钮后,我想将ContainerViewController(并且是2 childViewControllers)推送到我的LandingPageViewController

这是我要调用的功能:

func signOut() {
println("signOut")


// Set up the landing page as the main viewcontroller again.
let mainTableViewController = LandingPageVC()
mainTableViewController.navigationItem.setHidesBackButton(true, animated: false)
mainTableViewController.skipView = false
self.navigationController!.pushViewController(mainTableViewController, animated: true)

// Disable menu access
menuEnabled = false

// change status bar style back to default (black)
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default
}

起初我尝试将其放入我的SlidePanelViewController。那没用。所以我把它放在我假设它属于ContainerViewController

的地方

但是,当我点击菜单中的signOutButton时。我遇到了错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

查看错误时。这是导致它的一行:

self.navigationController!.pushViewController(mainTableViewController, animated: true)

错误之后,我检查了该函数的工作原理,添加了一个调用该函数的UINavigationBarButtonItem(在我的ContainerViewController中)。它完全符合我的要求。

然而,当我从菜单中调用此功能时(我的菜单再次是childViewController的{​​{1}})。它不起作用。

我试图像这样称呼它:

ContainerViewController

我还尝试向ContainerViewController().signOut() 添加Delegate,如下所示:

课前:

SidePanelViewController
@objc protocol SidePanelViewControllerDelegate { optional func needsSignOut(sender: SidePanelViewController) optional func toggleLeftPanel() optional func collapseSidePanels() } 中的

viewDidLoad()

在我的点击手势功能中:

//  Make sure your delegate is weak because if a ContainerViewController owns
//  a reference to a SidePanelViewController and the container view controller
//  is its delegate, you'll end up with a strong reference cycle!
weak var delegate: SidePanelViewControllerDelegate?

在我的func signOutTapGesture() { println("signOutTapGesture") selectView(signOutView) delegate?.needsSignOut?(self) println(delegate) } 课程之前:

ContainerViewController

我的var leftViewController: SidePanelViewController? 课程:

ContainerViewController

class ContainerViewController: UIViewController, CenterViewControllerDelegate, SidePanelViewControllerDelegate, UIGestureRecognizerDelegate { ContainerViewController's

viewDidLoad()

我将leftViewController?.delegate = self 类中的signOut函数更改为:

ContainerViewController

然而,使用上面的代理,似乎也没有做任何事情。

有关如何从菜单中成功推送LandingPageVC的任何帮助将不胜感激! (我没有使用故事板)

2 个答案:

答案 0 :(得分:1)

您尝试使用signOut致电ContainerViewController().signOut()。这将创建一个新的ContainerViewController,因为您还没有将其推送到导航控制器的堆栈,navigationController为零。尝试拨打self.signOut()。 (我在[{1}})方法中假设signOut

更新 - 代表

您的委托属性应该在ContainerViewController。我将举例说明如何实施它:

SidePanelViewController: (注意 - 协议不必去这里,但我认为它可以保持井井有条)

SidePanelViewController

ContainerViewController:

@objc protocol SidePanelViewControllerDelegate {
    optional func needsSignOut(sender: SidePanelViewController)
}

class SidePanelViewController: UIViewController {
    //  Make sure your delegate is weak because if a ContainerViewController owns
    //  a reference to a SidePanelViewController and the container view controller
    //  is its delegate, you'll end up with a strong reference cycle!
    weak var delegate: SidePanelViewControllerDelegate?

    //  Called when the UIButton is pressed.
    func myButtonWasPressed() {
        delegate?.needsSignOut?(self)
    }
}

希望有所帮助。

答案 1 :(得分:0)

问题似乎是navigationController为零并且您正试图强行打开它(如您的错误所示)。

我在另一个答案中讨论过一个问题。

另一个问题可能是您没有添加导航控制器。要做到这一点,你需要:

如果您正在使用故事板

您需要确保已嵌入UINavigationController。之后,当您使用navigationController时,它不会是零,您将能够推动您的视图控制器。

当你在故事板上时:

enter image description here

此外,如果您正在使用故事板,您是否考虑使用segues移动而不是调用presentViewController?我发现它让一切变得更加轻松。

如果您不使用故事板

看一下这篇文章:Programatically creating UINavigationController in iOS