我知道有两种方法可以在Swift中显示新的UIViewController
。有:
self.present(controllerToPresent, animated: true, completion: nil)
和
self.performSegue(withIdentifier: "controllerToPresent", sender: nil)
但是他们都将新的UIViewController显示在另一个上面。假设我不希望彼此堆叠控制器而不是仅仅切换控制器。提供的{em> new UIViewController
应该是 new 根控制器。一个例子是登录页面。一旦用户登录,我就不再使用登录控制器了,那么为什么我要将新控制器叠加在它上面呢。所以问题是,是否有一种切换(不堆叠)UIViewControllers的方法?
此外,我想知道当我使用上述两个函数之一时,为UIViewController的新实例分配的内存会发生什么。我不确定ARC是否会在某个时候释放内存,或者是否在某些时候内存不足而过于频繁地调用这些函数。
答案 0 :(得分:0)
具体而言,对于(正如您所提到的所示内容的例子):
这方面的一个例子是登录页面。一旦用户登录我 不要再使用登录控制器了
您需要在app委托中确定所需的rootViewController,例如:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// let's assume that you impelemnted to logic of how to determine whether the user loggedin or not,
// by using 'isLoggedin' flag:
if let wnwrappedWindow = self.window {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if isLoggedin {
let rootHomeVC = storyboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
//...
wnwrappedWindow.rootViewController = rootHomeVC
} else {
let rootloginVC = storyboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
//...
wnwrappedWindow.rootViewController = rootloginVC
}
}
return true
}
如果您想在登录视图控制器中更改根视图控制器,则可以在成功登录时实现以下代码:
let ad = UIApplication.shared.delegate as! AppDelegate
if let window = ad.window {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rootHomeVC = storyboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
//...
window.rootViewController = rootHomeVC
}
答案 1 :(得分:0)
有很多方法可以做你想要的......
一种方法,因为你评论你想要动画:
addChildViewController()
和addSubview()
来显示您的"登录"图。addChildViewController()
和addSubview()
来显示您的"主要"图。在3的情况下,当用户完成log = on进程时,实例化" main"查看控制器,并使用addChildViewController()
...然后addSubview()
,但隐藏和/或在屏幕外添加它,并使用UIView
动画替换"登录&#34 ;查看" main" view ...然后从内存中删除登录视图和控制器(removeFromSuperview,removeFromParentViewController,将vc引用设置为nil等)。
如果在某些时候你想要"注销"并返回登录界面,执行相同操作...实例化loginVC,addsubview,动画子视图,删除mainVC。