iOS - presentViewControllerAnimated vs window.rootViewController

时间:2015-06-06 05:51:42

标签: ios swift uiviewcontroller

我有一个类MasterViewController,可以在app启动时加载。在viewDidLoad()内,它检查用户是否已登录,并根据结果显示一个视图控制器或另一个视图控制器。如果您尚未登录,然后继续执行此操作,该应用会加载新的MasterViewController。我的目标是基本上用新实例替换现有MasterViewController,以便再次执行viewDidLoad中的检查。我尝试了以下内容,但它们都有效:

// changing the root view controller
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
appDelegate.window!.rootViewController = MasterViewController()
appDelegate.window!.makeKeyAndVisible()

// using presentViewControllerAnimated
someViewController.presentViewControllerAnimated(MasterViewController(), animated: true, completion: nil)

...虽然presentViewControllerAnimated有一个很好的动画,但改变root并不是。更重要的是,更改根视图控制器并不会破坏现有的控制器(至少deinit永远不会被调用..),显然presentViewControllerAnimated也不会这样做,所以在这两种情况下我都有这个视图控制器漂浮在我不想要的地方。

我可以想象一下用户多次注销和重新登录的情况,突然间我有10个MasterViewControllers。有什么方法可以完全清除视图控制器吗?或者这完全没必要?

修改

记住presentViewControllerAnimated是用于以模态方式呈现vc,因此绝对不是我想要的。不过可以用类似的动画更改根视图控制器。我在root vc变化中看到的所有动画都非常不稳定。

2 个答案:

答案 0 :(得分:1)

以下Stackoverflow主题触及您对内存中遗留的旧UIViewController的关注:

Stackoverflow: Changing root view controller of a iOS Window

serge-k的答案来自UIWindow Class Reference

var rootViewController: UIViewController?
  

窗口的根视图控制器。

     

根视图控制器提供窗口的内容视图。   将视图控制器分配给此属性(以编程方式   或者使用Interface Builder)将视图控制器的视图安装为   窗口的内容视图。如果窗口具有现有视图   层次结构,旧视图在新视图之前被删除   安装。此属性的默认值为nil。

UIViewController编程指南的Resource Management in UIViewController部分也包含一个注释:

  

视图控制器的默认行为是加载其视图层次结构   首次访问view属性时,将其保留在内存中   直到视图控制器被丢弃。视图使用的内存   在屏幕上绘制自己可能非常大。但是,系统   当视图不是时,会自动释放这些昂贵的资源   附在窗户上。大多数视图使用的剩余内存很小   足以让系统自动清除它并不值得   重新创建视图层次结构。

     

如果有额外的内存,您可以显式释放视图层次结构   是您的应用程序所必需的。清单4-3覆盖了   didReceiveMemoryWarning方法来完成这个。首先是呼叫   超类的实现,以获取任何所需的默认行为。然后,   它清理视图控制器的资源。最后,它测试是否   视图控制器的视图不在屏幕上。如果视图是关联的   有一个窗口,然后它清理任何视图控制器的强大   对视图及其子视图的引用。如果视图存储了数据   需要重新创建,此方法的实现应该保存   在释放对这些视图的任何引用之前的数据。

答案 1 :(得分:0)

以下代码和概念对您有所帮助

NSURLConnection

这里

  var window: UIWindow?
  var viewController: MasterViewController?
  var navigationVC:UINavigationController?
  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
  {
    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    if let window = window {
        window.backgroundColor = UIColor.whiteColor()
        viewController = MasterViewController(nibName: "MasterViewController", bundle: nil);
        //If you want NavigtionController
        navigationVC = UINavigationController(rootViewController: viewController!)
        navigationVC?.navigationBar.hidden = true
        window.rootViewController = navigationVC
        //Or If you don't want navigation controller
        window.rootViewController = viewController
        window.makeKeyAndVisible()
    }
    return true
}