切换UIViewController而不是以模态方式呈现它或将它堆叠在一起

时间:2017-11-19 11:14:36

标签: ios swift uiviewcontroller

我知道有两种方法可以在Swift中显示新的UIViewController。有:

self.present(controllerToPresent, animated: true, completion: nil) 

self.performSegue(withIdentifier: "controllerToPresent", sender: nil) 

但是他们都将新的UIViewController显示在另一个上面。假设我不希望彼此堆叠控制器而不是仅仅切换控制器。提供的{em> new UIViewController应该是 new 根控制器。一个例子是登录页面。一旦用户登录,我就不再使用登录控制器了,那么为什么我要将新控制器叠加在它上面呢。所以问题是,是否有一种切换(不堆叠)UIViewControllers的方法?

此外,我想知道当我使用上述两个函数之一时,为UIViewController的新实例分配的内存会发生什么。我不确定ARC是否会在某个时候释放内存,或者是否在某些时候内存不足而过于频繁地调用这些函数。

2 个答案:

答案 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)

有很多方法可以做你想要的......

一种方法,因为你评论你想要动画:

  1. 使用"容器"查看您的" root"视图控制器
  2. 启动时,检查用户是否已登录"
  3. 如果已登录,请实例化"登录"查看控制器,并使用addChildViewController()addSubview()来显示您的"登录"图。
  4. 否则,如果已经在启动时登录,则实例化" main"查看控制器,并使用addChildViewController()addSubview()来显示您的"主要"图。
  5. 在3的情况下,当用户完成log = on进程时,实例化" main"查看控制器,并使用addChildViewController() ...然后addSubview(),但隐藏和/或在屏幕外添加它,并使用UIView动画替换"登录&#34 ;查看" main" view ...然后从内存中删除登录视图和控制器(removeFromSuperview,removeFromParentViewController,将vc引用设置为nil等)。

    如果在某些时候你想要"注销"并返回登录界面,执行相同操作...实例化loginVC,addsubview,动画子视图,删除mainVC。