AppDelegate
initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController")as! UIViewController
}
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
带我去LoginViewController
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("CardsNavController") as? UIViewController
self.presentViewController(vc!, animated: true, completion: nil)
我点击登录按钮将我带到CardsViewController
func goToProfile(button: UIBarButtonItem) {
pageController.goToPreviousVC()
}
单击作为UINavigationController一部分的后退按钮运行goToProfile(上面)并将我带到ViewController.swift,因为这是声明pageController的地方。
let pageController = ViewController(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil)
错误显示在这里
func goToPreviousVC() {
//let currentControllers = self.navigationController?.viewControllers
if viewControllers.isEmpty {
setViewControllers([profileVC], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: nil)
pageController.presentViewController(profileVC, animated: true, completion: nil)
else {
let previousVC = pageViewController(self, viewControllerBeforeViewController: viewControllers[0] as! UIViewController)!
setViewControllers([previousVC], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: nil)
}
错误:
Warning: Attempt to present <UINavigationController: 0x15ce314e0> on <MyApp.ViewController: 0x15cd2c6f0> whose view is not in the window hierarchy!
基本上流程就像这个AppDelegate - &gt; LoginViewController - &gt; ViewController和我需要访问ProfileViewController。
ProfileView具有ProfileNavController,而CardsView具有CardsNavController
ViewController的pageboardID为pageController。
ProfileView和CardsView都嵌入在UINavigationControllers中(因此是NavController扩展)。
我第二次在全新安装后运行应用程序它完美运行(所有控制器都可以正常加载)。我应该在AppDelegate中推送viewControllers吗?
答案 0 :(得分:1)
我已经使用Xcode 7检查了您的代码,这可能不是解决此问题的理想选择,因为我不得不将您的代码转换为Swift 2.0,但这是我发现的。
<强>问题强>
首次打开应用程序,此块:
if currentUser() != nil {
initialViewController = pageController
}
else {
initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as UIViewController
}
self.window?.rootViewController = initialViewController
将初始化LoginViewController
并将其设为当前窗口rootViewController
。
此时没有pageController
初始化
当用户点击按钮进入“个人资料”屏幕时,将调用此方法
func goToProfile(button:UIBarButtonItem){ pageController.goToPreviousVC() }
此时,pageController已初始化,当然,viewControllers
数组中仍有NOTHING。让我们看看goToPreviousVC
方法中发生了什么:
原始方法如下所示:
let nextVC = pageViewController(self, viewControllerAfterViewController: viewControllers[0] as UIViewController)!
setViewControllers([nextVC], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
您可以看到的一件事是:调用viewControllers[0]
可能会导致崩溃,因为viewControllers
是一个空数组。
如果您使用Swift 2.0,它甚至不能让您编译代码:)
<强>解强>
让我们直接进入解决方案:在尝试调用它之前确保pageController
可用。
我盲目地尝试修复你在Swift 2.0中的代码,发现这个方法适合你:
之前:在LoginViewController.swift
第63行
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("CardsNavController") as? UIViewController
self.presentViewController(vc!, animated: true, completion: nil)
AFTER:让我们像这样修复
let navc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("CardsNavController") as! UINavigationController
if let viewControllers = pageController.viewControllers where viewControllers.count == 0 {
pageController.setViewControllers([navc.viewControllers[0]], direction: .Forward, animated: false, completion: nil)
}
self.presentViewController(pageController, animated: true, completion: nil)
它在这里运作良好,可能我不需要向您展示屏幕转换应该如何:)
如果您希望获得固定的源代码,请找到它HERE。基本上我将您的代码转换为Swift 2.0并忽略了Facebook身份验证等不必要的部分,以便更快地进行调查。
祝你好运&amp;快乐的编码!