尝试呈现其视图的UINavigationController

时间:2015-09-15 19:51:35

标签: ios swift

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吗?

storybord

1 个答案:

答案 0 :(得分:1)

我已经使用Xcode 7检查了您的代码,这可能不是解决此问题的理想选择,因为我不得不将您的代码转换为Swift 2.0,但这是我发现的。

<强>问题

  1. 首次打开应用程序,此块:

    if currentUser() != nil {
        initialViewController = pageController
    }
    else {
        initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as UIViewController
    }
    
    self.window?.rootViewController = initialViewController
    
  2. 将初始化LoginViewController并将其设为当前窗口rootViewController。 此时没有pageController初始化

    1. 当用户点击按钮进入“个人资料”屏幕时,将调用此方法

      func goToProfile(button:UIBarButtonItem){     pageController.goToPreviousVC() }

    2. 此时,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)
      

      它在这里运作良好,可能我不需要向您展示屏幕转换应该如何:)

      enter image description here

      如果您希望获得固定的源代码,请找到它HERE。基本上我将您的代码转换为Swift 2.0并忽略了Facebook身份验证等不必要的部分,以便更快地进行调查。

      祝你好运&amp;快乐的编码!