Ios 取消两个模态视图控制器

Ios 取消两个模态视图控制器,ios,controller,transition,Ios,Controller,Transition,关于这一点,我发现了几个问题,但答案并不能解决我的问题 我有两个控制器,我已经介绍了使用presentModalViewController 我向主控制器调用的第一个控制器添加了modalTransitionStyle。第一个控制器正常呈现第二个控制器(无过渡样式) 这是我用来转到MainVC的代码: [self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];

关于这一点,我发现了几个问题,但答案并不能解决我的问题

我有两个控制器,我已经介绍了使用presentModalViewController

我向主控制器调用的第一个控制器添加了modalTransitionStyle。第一个控制器正常呈现第二个控制器(无过渡样式)

这是我用来转到MainVC的代码:

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];
事情就是这样:


这一页没有展开。我遇到这种情况的原因是什么?

您应该在这个电话中一个接一个地介绍您的两种观点:

[self presentViewController:firstViewController animated:YES completion:^(
    [self presentViewController:secondViewController animated:YES completion:^(

    }];
}];
这应该表现得更好。另外,要知道,之后必须同时关闭这两个ViewController

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{

    }];
}];

看起来你在忽略“第一”而不忽略“第二”

苹果推荐的方法是授权

尝试将mainVC设置为“first”的委托,以便first可以调用mainVC的一个方法来解除其自身。通过声明'first'的'delegate'属性并在实例化'first'时将其设置为mainVC来实现此目的。然后在first.h中定义一个“firstDelegate”协议,该协议包含一些函数,如“dismissFirst”,然后在mainVC中导入first.h。现在,在mainVC中实现dismissFirst,以实际取消“first”,并在显示first后执行任何您想要的操作

喘息。。。现在,以同样的方式将“first”作为“second”的委托,只需将“dismissSecond”函数调用mainVC的“dismissFirst”函数,一切都将正常进行

我知道这有点复杂,但委派是iOS的核心概念,这是使用委派的典型例子

下面是一个很好的解释如何工作。


我祝你好运,在你永不停息的探索中,去理解一个苹果工程师(也称为Obj-C)大脑的内部阴谋。

在我的实验中,似乎你不能在部分卷曲后有一个标准的呈现(垂直覆盖),并同时消除它们,除非在动画设置为“否”的情况下执行解雇

解决此问题的一种方法是在没有动画的情况下关闭secondVC(此代码位于secondVC中):

然后,在测试控制器未显示后,在firstVC中,在ViewDid中再次显示动画:

-(void)viewDidAppear:(BOOL)animated {
    if (![self isBeingPresented]) {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}
当上面的代码返回到初始控制器的视图时,您将看到firstVC的视图出现在卷曲展开之前。如果你不想看到这一点,那么我能找到的唯一解决办法就是创建secondVC的一个映像,在取消secondVC之前,将它作为(映像视图中的)子视图添加到firstVC。因此,要做到这一点,secondVC中的代码应该是这样的(请注意,您必须链接到QuartzCore并将其导入secondVC才能工作):


我也有同样的疑问。我用另一种方式解决了-

步骤1:在全局类(单例)中,可以定义变量标志

@property (nonatomic) int flag;
步骤2:假设您需要关闭
第二视图控制器
第一视图控制器
,并返回到
主视图控制器
,在关闭第二视图控制器时,您可以将此值设为假设1

[[Global sharedObject] setFlag:1];
[self.navigationController popViewControllerAnimated:YES];
步骤3:在您的
-(void)视图中将出现:(BOOL)第一视图控制器的动画方法

if([[Global sharedObject] flag] == 1)
{
    [[Global sharedObject] setFlag:0];
    [self performSelector:@selector(back) withObject:nil afterDelay:0.5];
}

- (void) back
{
[self.navigationController popViewControllerAnimated:YES];
}

我希望你的答案能用这个解决。如果你还有疑问,你可以问。干杯:)

您需要使用
放松序列。在要转到的视图控制器中创建一个“空”iAction

@IBAction func unwindToController(segue: UIStoryboardSegue) {

}
然后转到故事板并选择您想要的控制器。在选定控制器顶部的图标中,最左边应该是一个黄色圆圈,中间有一个白色小正方形,即文件所有者。按住Ctrl键并拖动到要展开到的视图控制器的“退出”标签。可以在控制器树的底部附近找到出口,或者在故事板上找到最右边的红色正方形图像,其中带有白色正方形和右箭头。弹出一个对话框,选择您创建的
unwindToController
操作

一个新的“退绕到退出”将出现在您的FROM控制器中。双击它并给它一个标识符,例如
取消标识符

现在,如果要展开两个控制器,请在“从”控制器中使用:

self.performSegueWithIdentifier("unwindIdentifier", sender:nil)

这将跳过中间的控制器并展开到第二个控制器,在动画中仅显示to控制器。

感谢您的回答。但是第二个视图控制器只有在单击第一个控制器视图内的按钮后才会被调用。啊,然后确保在结束后将它们都拔出。嗨,哈尔,你的回答帮助了我。我所做的是在完成块内发布通知<代码>代码
[self.presentingViewController dismissViewControllerAnimated:无完成:^{[[NSNotificationCenter defaultCenter]后通知名称:@“BACKTOMAIN”对象:nil];}];可以忽略在链中彼此呈现的多个控制器。如果您解除链中的第一个,则所有其他的都将解除。在这个特定的例子中,问题是由于演示样式把它搞砸了。我通过使用HalR给出的代码和一些修改解决了这个问题。我添加了一个通知以关闭另一个控制器。我已使用[self.presentingViewController dismissViewControllerAnimated:NO completion:^{[[NSNotificationCenter defaultCenter]postNotificationName:@“BACKTOMAIN”对象:nil];}]成功解决了该问题;然后在接收控制器中,我添加了[self dismissModalViewControllerAnimated:YES];谢谢你的回答:)
if([[Global sharedObject] flag] == 1)
{
    [[Global sharedObject] setFlag:0];
    [self performSelector:@selector(back) withObject:nil afterDelay:0.5];
}

- (void) back
{
[self.navigationController popViewControllerAnimated:YES];
}
- (UIViewController*)topViewController
{
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
    while (topController.presentedViewController) {
        topController = topController.presentedViewController;
    }
    return topController;
}


- (void)dismissAllModalController{

    __block UIViewController *topController = [self topViewController];

    while (topController.presentingViewController) {
        [topController dismissViewControllerAnimated:NO completion:^{

        }];
        topController = [self topViewController];
    }
}
@IBAction func unwindToController(segue: UIStoryboardSegue) {

}
self.performSegueWithIdentifier("unwindIdentifier", sender:nil)