我有一个类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变化中看到的所有动画都非常不稳定。
答案 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
}