【问题标题】:Swift / How to properly dismiss a rootViewController?Swift / 如何正确关闭 rootViewController?
【发布时间】:2016-09-08 05:23:38
【问题描述】:

在我的一个视图中,我正在创建一个 rootViewController:

    dispatch_async(dispatch_get_main_queue()) {

        let pageController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
        let nav = RootDJasUserVC(rootViewController: pageController)

        appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        appDelegate.window?.rootViewController = nav
        appDelegate.window?.makeKeyAndVisible()

    }

使用 RootDJasUserVC 的视图我正在调用另一个函数来访问另一个 rootViewController:

    dispatch_async(dispatch_get_main_queue()) {

        let pageController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
        let nav = RootVC(rootViewController: pageController)

        appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        appDelegate.window?.rootViewController = nav
        appDelegate.window?.makeKeyAndVisible()

    }

我不想回到RootDJasUserVC,但我希望RootDJasUserVC 是全新加载的。目前,当我返回RootDJasUserVC(与第一个代码块中的功能相同)时,viewDidLoad 将不会被执行,因为视图显然仍在某个地方加载。

如何正确地“关闭”这样的 rootViewController 以使其“重新加载”?非常感谢您的帮助。

PS。我想做的是在RootDJasUserVC

dismissViewControllerAnimated(true, completion: nil)

但是当我执行它时什么都没有发生。

PPS。这些 rootViewController 是 UINavigationController 的子类

【问题讨论】:

  • 您的链接上的解决方案对我不起作用,即使它是相似的。我想解雇一个“rootViewController”,只是一个viewController。如果我点击了一个声明为该方法的按钮,它就不起作用。 ->什么都没发生
  • @DavidSeek 查看编辑后的代码
  • @DavidSeek 检查答案的编辑 3
  • @DavidSeek 查看我的答案的最后编辑,希望对您有所帮助

标签: ios swift uiviewcontroller


【解决方案1】:

不需要每次都改变根视图控制器,如果你想你可以在任何时间点显示视图控制器,例如,让你的代码,

在下面的代码中你只是将根视图控制器设置为RootDJasUserVC

dispatch_async(dispatch_get_main_queue()) {

    let pageController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
    let nav = RootDJasUserVC(rootViewController: pageController)

    appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    appDelegate.window?.rootViewController = nav
    appDelegate.window?.makeKeyAndVisible()
}

如果您想显示新控制器,则无需更改根视图控制器RootDJasUserVC,只需显示视图控制器即可,

dispatch_async(dispatch_get_main_queue()) {

    let pageController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
    let nav = RootVC(rootViewController: pageController) //check with simply presenting the view controller if u don't want navigation controller

    //appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    //let rootVc = appDelegate.window?.rootViewController!
    self.presentViewController(nav, animated: false, completion: {

        })
    //no need of below code
    //appDelegate.window?.rootViewController = nav
    //appDelegate.window?.makeKeyAndVisible()
}

一旦你出现,你就可以关闭视图控制器

使用dismissViewControllerAnimated(true, completion: nil) 一旦视图控制器被关闭,viewWillAppearviewDidlAppear 方法被调用,使用它来刷新RootDJasUserVC

编辑 2

我不知道到底发生了什么,但如果你想加载新的根视图控制器,请执行以下操作,

只需在应用委托中添加一个方法来加载新的根视图控制器

func loadNewRootViewController()
{
    let controller:RootDJasUserVC = RootDJasUserVC(nibName: "RootDJasUserVC", bundle: nil)
    let aNavController:UINavigationController? = UINavigationController(rootViewController: controller)
    self.window?.rootViewController = aNavController;
    self.window?.makeKeyAndVisible()
}

上面的方法加载新的根视图控制器,一旦视图控制器的关闭让你说在你关闭视图控制器之后,你只需要调用它

self.dismissViewControllerAnimated(false) { 
        //change the root hear
       let appdelegate =  UIApplication.sharedApplication().delegate as! AppDelegate
       appdelegate.loadNewRootViewController() //load new fresh root view controller
}

编辑 3

 self.navigationController!.dismissViewControllerAnimated(false)  { 
        //change the root hear
       let appdelegate =  UIApplication.sharedApplication().delegate as! AppDelegate
       appdelegate.loadNewRootViewController() //load new fresh root view controller
}

编辑 4

在显示第二个视图控制器时, 显示pageController

 let pageController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
 let nav = RootVC(rootViewController: pageController) //check with simply presenting the view controller if u don't want navigation controller

 //appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
 //let rootVc = appDelegate.window?.rootViewController!
 self.presentViewController(nav, animated: false, completion: {

  })

它会如你所说的显示新的控制器,例如在这个类中你需要调用dismiss方法,

在显示视图控制器的第二个中,你可以像下面这样关闭

 self.navigationController!.dismissViewControllerAnimated(false)  { 
    //change the root hear
   let appdelegate =  UIApplication.sharedApplication().delegate as! AppDelegate
   appdelegate.loadNewRootViewController() //load new fresh root view controller
 } 

听到self.navigationController 不应该为零,因为在展示时你设置了一个RootVC() 它是导航控制器。

【讨论】:

  • 但我需要一个新的 rootViewController。 rootViewController 是一个 navigationBarController,在 viewDidLoad 中设置了一个 viewControllers 数组。我的问题是,navigationBarController 内的 THOSE viewControllers 的内容需要刷新。但是例如将其放入 viewWillAppear 并不能解决问题,因为如果您在 RootDJasUserVC 中,用户将快速浏览这些 viewController 内容,您不希望内容不断重新加载
  • 你的代码抛出 nil on: let rootVc = appDelegate.window?.rootViewController! while unwrapping optional
  • 它应该有一个根视图控制器RootDJasUserVC,同时注意显示第二个控制器nav
  • 我复制粘贴你的代码并得到fatal error: unexpectedly found nil while unwrapping an Optional value
  • RootDJasUserVC 是 rootViewController 我想回到 RootVC
【解决方案2】:

将您的重新加载代码放在RootDJasUserVCviewWillAppear 中(viewDidLoad 只运行一次),每次您返回该视图时都会调用它,我相信这是比创建新实例更好的方法它

【讨论】:

  • 不工作。在 RootDJasUserVC 中,将创建并初始化一个 viewController 数组。仅适用于 viewDidLoad,应用程序会在 viewDidLoad 中崩溃。
  • 所有视图都有tableViews,如果内容将在viewWillAppear中加载,则每次用户滑动应用程序时都会重新加载它们
  • 我听不懂你在说什么......你试过把你的数组创建代码放在 viewWillAppear 中了吗?
  • 我有,但RootDJasUserVC 是自定义类“SwipeViewController”的控制器。该类需要在 viewDidLoad 中实例化 viewControllerArray。应用程序在 viewWillAppear 内崩溃
猜你喜欢
  • 2012-06-27
  • 2017-03-29
  • 2019-07-20
  • 2019-04-12
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多