在后台关闭模态视图控制器

Posted

技术标签:

【中文标题】在后台关闭模态视图控制器【英文标题】:Dimiss modal View Controller in background 【发布时间】:2015-06-03 09:18:41 【问题描述】:

我收到了 View A present -> Modal View B, B present -> Modal View C Modal View D -> Modal View E 。这是一个主视图A,然后是模态视图的继承。 所以每次我呈现新的模态 C 或 D 我都想关闭前一个模态(这样当我关闭新呈现的模态时,它会显示主视图 A 始终不是前一个模态)。

如果我在 B 并且我想展示 C,那么我必须先展示 C 然后在后台我解雇 B。 如果我在 C 中并且我想呈现 E,那么我先呈现 E,然后再呈现 在后台关闭 C

我试过这段代码:

if (_openNextView) 
        if ([[NSUserDefaults standardUserDefaults] stringForKey:@"generatedCode"]) 
            NSLog(@"generated Code %@ : ", [[NSUserDefaults standardUserDefaults] stringForKey:@"generatedCode"]);
            NSLog(@"phone Number %@ : ", [[NSUserDefaults standardUserDefaults] stringForKey:@"phoneNumber"]);

            // Present C View
            RegisterSecondViewController *registerSecond = [[RegisterSecondViewController alloc] initWithNibName:@"RegisterSecondViewController" bundle:nil];

            //[self presentNatGeoViewController:registerSecond];

            [self presentViewController:registerSecond animated:YES completion:nil];
         else 
            RegisterFirstViewController *registerFirst = [[RegisterFirstViewController alloc] initWithNibName:@"RegisterFirstViewController" bundle:nil];

             //present D view
            //[self presentNatGeoViewController:registerFirst];
            [self presentViewController:registerFirst animated:YES completion:nil];
        
// Dismiss privious View (the current view before presenting new one)
    [self.parentViewController dismissViewControllerAnimated:YES completion:nil];

我还可以在新呈现的模态视图中添加此代码

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

但是没有用,视图也没有被关闭

【问题讨论】:

你为什么使用模态? 哦,对不起,我没注意它的注册系统,它可以从任何视图(如弹出窗口)中显示,有时用户可以跳过步骤但不能返回。你觉得这不是个好选择吗? 【参考方案1】:

我会以模态方式呈现UINavigationController 并使用它来呈现内容视图。然后,当您当前呈现新的模态视图时,您只需设置导航控制器的 viewControllers(动画)。

这将为您提供整个设置过程的动态视图,但不允许用户返回并在完成后释放 VC。

【讨论】:

谢谢我已经尝试过了,我还隐藏了导航栏以使其看起来像模态视图,它起到了魅力谢谢【参考方案2】:

UIViewController 有一个名为 presentedViewController 的属性:

呈现视图控制器 属性视图控制器是 由此视图控制器或其在视图中的祖先之一呈现 控制器层次结构。 (只读)

这意味着,您在给定时间只能呈现一个模态控制器。为了呈现另一个,您需要先关闭当前的。

如果您想要自定义导航,我建议您创建自定义容器视图控制器,因为普通的模态演示不适合您的用例。 Here 是来自 Apple 的指南。

【讨论】:

我想你错过了理解我,当我展示新的视图模式时,我想关闭前一个,所以当我关闭新的模式时,我会在屏幕上看到主视图 A 而不是以前的模式查看【参考方案3】:

您可以在呈现新的 vc 之后关闭当前的 vc。试试这个:

[self presentViewController:vc animated:YES completion:^
    if (self.presentingViewController != nil) 
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
            [self dismissViewControllerAnimated:NO completion:nil];
        );
    
];

【讨论】:

这将关闭新呈现的视图控制器

以上是关于在后台关闭模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

一次关闭多个模态视图控制器?

关闭模态视图控制器后在根视图控制器中执行操作

视图控制器以模态方式呈现/关闭时的通知?

模态视图控制器,关闭并弹回视图控制器

关闭当前的模态视图控制器,然后呈现新的模态视图控制器

关闭模态视图控制器