简短说明。
我有一个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的任何帮助将不胜感激! (我没有使用故事板)
答案 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
时,它不会是零,您将能够推动您的视图控制器。
当你在故事板上时:
此外,如果您正在使用故事板,您是否考虑使用segues移动而不是调用presentViewController
?我发现它让一切变得更加轻松。
如果您不使用故事板
看一下这篇文章:Programatically creating UINavigationController in iOS