【问题标题】:Deinit Two ViewController at the same time in Swift在 Swift 中同时 Deinit 两个 ViewController
【发布时间】:2018-12-04 00:29:46
【问题描述】:

我有两个UIViewController。第一个是欢迎屏幕,第二个是登录屏幕(位于导航控制器内)。用户可以使用返回按钮从登录屏幕返回欢迎屏幕,因此登录屏幕以self.present(LoginViewController(),animated: false) 打开,在登录屏幕之后,最终UIViewControllerappDelegate.window?.rootViewController = FinalViewController() 打开。

我的问题是 LoginViewControllerWelcomeViewController 在这种情况下都没有 deinit。但是,如果我;

  • 直接从WelcomeViewController 打开FinalViewController(通过更改RootViewController),而不显示LoginViewController
  • 打开 LoginViewController 而不显示 WelcomeViewController 然后打开 FinalViewController(再次更改 RootViewController)

控制器已取消。所以我认为任何视图控制器都没有保留周期与..

我想在打开最终控制器后取消登录和欢迎屏幕。

编辑:我发现将它放在 NavigationController 中会阻止定义。

EDIT2: 如果我在更改 rootViewController 之前调用 self.dismiss(animated: false, completion: nil)。所有控制器似乎都被取消了,但我不确定这是否会是一个更好的答案。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    你为什么不使用这个层次结构:

    -UIWindow
    -----UIWindow.RootViewController
    ----------UINavigationController
    ---------------WelcomeScreen
    ---------------LoginScreen (Push without animation)
    

    登录成功:

    -UIWindow
    -----UIWindow.RootViewController
    ----------UINavigationController
    ---------------FinalViewController
    

    隐藏导航栏并根据需要使用animated属性。

    编辑

    来自document的一部分:

    viewControllerToPresent

    在当前视图控制器上显示的视图控制器的内容。

    因此父控制器的引用可以从提供的控制器访问,因此两个 VC 可以相互访问。例如,self.presentedViewController。为了删除它,必须解散控制器。所以presenter控制器会释放presenter控制器的引用。

    【讨论】:

    • 因为欢迎屏幕没有导航栏。
    • 你一定要把它放在导航控制器之外吗?
    • 对不起,我不明白?
    • 为什么欢迎屏幕不在导航控制器内?你能在导航控制器中移动欢迎屏幕吗?
    • 因为欢迎屏幕没有导航栏。正如你所说,我可以将它放在导航控制器中并隐藏导航栏,但正如我在这篇文章中所读到的,在滑动等时可能会导致一些问题。stackoverflow.com/questions/845583/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2018-08-13
    相关资源
    最近更新 更多