【问题标题】:How to call UIViewController.present (was presentViewController) and get rid of the presentingViewController如何调用 UIViewController.present(是 presentViewController)并摆脱 presentingViewController
【发布时间】:2017-03-28 11:43:17
【问题描述】:

我知道通常情况下,当 UIViewController A 呈现另一个 UIViewController B 时,ApresentedViewController 属性设置为 B。所以A 保留在内存中。

简单地说,我想通过A 展示B,然后清理A,因为它永远不会被退回。

为了更完整的解释和理由,在我的应用程序中,我有一个 UINavigationController,它可能在层次结构中有一堆屏幕。在某些时候(例如用户注销),我想通过调用self.present(loginViewController, animated: true, completion: nil) 来呈现一个新的视图控制器(登录)。但是,应用程序不可能通过从登录控制器调用“dismiss”返回 UINavigationController。如果执行登录,登录视图控制器将“呈现”一个新的 UINavigationController。

我希望清理原始 UINavigationController 及其所有层次结构,因为层次结构中可能有许多屏幕似乎永远不会再次使用。

(另外,在这种情况下,当用户启动应用程序时,他们是“自动登录”的,所以 UINavigationController 是根控制器。因此,当注销时,它不能“关闭”自己到返回登录屏幕。)

谢谢!

【问题讨论】:

    标签: ios swift uiviewcontroller uinavigationcontroller


    【解决方案1】:

    您不能使正在呈现的视图控制器从呈现的视图控制器后面消失。但是……

    第一点:视图控制器是相当轻量级的,所以从不返回当前视图控制器确实没有什么问题。

    第二点:如果问题是您希望应用根据用户的登录状态以不同方式启动(即使用不同的根视图控制器),那么需要注意的地方那是在您对application:didFinishLaunchingWithOptions: 的实现中。

    第三点:如果这确实是个问题,那么也许您需要重新考虑您的整个架构。也许您根本想要一个呈现的视图控制器,而是想要一个替换第一个视图控制器的视图控制器。有很多方法可以安排。

    【讨论】:

    • 至第一点:更重要的是,我有一个 UINavigationController,它的层次结构中可能有几到几十个屏幕。我想摆脱所有这些(但就您而言,也许这仍然无关紧要)。
    • 第二点:不,以不同的方式启动并不是我想要的。
    • 我认为你的第三点是我正在寻找的。我不确定如何替换视图控制器。是时候进行更多的谷歌搜索/搜索了... :)
    • 也许这里的问题是你的整个应用程序倒退了。也许“注销”的视图控制器应该是主视图控制器,而导航控制器应该是呈现的视图控制器。这样,当我们登录时,只有一个看不见的视图控制器,它是轻量级的,当我们注销时,整个导航控制器复合体就没有了。
    【解决方案2】:

    这个问题和enter link description here的问题类似

    为了您的方便,我在下面添加我的答案。

    您可以使用类似于

    的代码来实现此目的
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: <Identifier as in Storyboard of B>)
    (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController = vc
    

    如果您想包含一个过渡,您可以将最后一行替换为以下内容:

    UIView.transition(from: currentRootViewController!.view, to: vc.view, duration: 0.8, options: .transitionCrossDissolve, completion: { (_) in
          (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController = vc
    })
    

    【讨论】:

      【解决方案3】:

      据我了解,您有一个根 UINavigationController,无论应用程序是否有用户登录,您都可以在其中显示不同的视图控制器。如果是这种情况:

      if (user != nil){
      myNavigationController.setViewControllers([*/Initialize your first ViewController*/])
      }else {
      myNavigationController.setViewControllers([*/Initialize your LoginViewController/])
      }
      

      如果用户logsOut/logsIn 只需发送一个本地通知,告诉导航控制器用户状态已更改并检查用户是否存在。

      还要确保所有视图控制器都被取消初始化,这样它们就不会留在内存中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 2014-01-28
        相关资源
        最近更新 更多