父视图控制器未被解雇

时间:2016-10-18 12:58:19

标签: ios swift

我的presentViewController功能存在问题。

我有一个登录菜单(A)和一个显示登录表单的按钮(B)。成功登录后,我将使用self.presentViewController(C)提供第三个视图。

登录菜单(A) - >登录表格(B) - >内容(C)

它的工作,我可以提供第三个视图(C),但登录菜单(A)始终可见(我可以在UI Debug mod中看到它)。

那么,如何关闭A ViewController?

3 个答案:

答案 0 :(得分:1)

presentViewController,以模态方式呈现视图控制器。换句话说,在当前视图控制器的内容上,当前视图控制器将不会被取消分配。

为您的样本使用以下代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: <Identifier as in Storyboard of C>)
(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
})

答案 1 :(得分:1)

如果我们考虑 presentVieController 机制,这不是问题或错误。如果你觉得你不想让你以前的控制器保留在Hierarchy中,那么你必须改变流程。

目前您的流程是:

A - &gt; RootViewController的。 B - &gt; LoginScreen C - &gt;容器

我建议在下面的答案中提及最佳做法。

Best practices for Storyboard login screen, handling clearing of data upon logout

如果您考虑处理流程,您可以解决您的问题。这是我的建议

建议

  1. 您将 C 设置为rootController,在 C的ViewDidLoad 中,您检查天气用户是否已登录,如果用户未登录,则可以显示 A ,从那里你可以出现 B 。成功登录后,您可以解除 A B ,并根据记录的用户值刷新rootController C
  2. 要关闭多个视图控制器,您可以尝试下面的代码

    -(void)dismissModalStack {
        UIViewController *vc = self.presentingViewController;
        while (vc.presentingViewController) {
            vc = vc.presentingViewController;
        }
        [vc dismissViewControllerAnimated:YES completion:NULL];
    }
    
    1. 您还可以使用 ContainerView 机制,将 C 设置为rootController,在 C 中,您可以使用 ContainerView < / strong>您可以在其中显示 A B ,登录后,您可以将其删除并刷新 C
    2. 希望它有帮助!

答案 2 :(得分:0)

我认为本教程的答案为https://www.youtube.com/watch?v=WIaRs2d6Xm0