解雇两个模态视图控制器

时间:2013-08-29 03:08:25

标签: ios controller transition

我发现了几个有关此问题,但答案并没有解决我的问题。

我有两个使用presentModalViewController呈现的控制器。

我将modalTransitionStyle添加到主控制器调用的第一个控制器。第一个控制器正常显示第二个控制器(没有过渡方式)。

FirstVC *first = [[FirstVC alloc] initWithNibName:@"FirstVC" bundle:nil];
first.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentModalViewController:first animated:YES];

SecondVC *second = [[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
[self presentModalViewController:second animated:YES];

这是我以前用于访问MainVC的代码:

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];

这就是发生的事情:

enter image description here

页面没有展开。我遇到这个的原因是什么?

6 个答案:

答案 0 :(得分:6)

在我的实验中,看起来在部分卷曲之后你不能有一个标准的演示文稿(覆盖垂直),并且同时将它们两个都解除,除非你在动画设置为NO的情况下进行解雇。

解决这个问题的方法是解除没有动画的secondVC(此代码在secondVC中):

-(IBAction)dismissSelf:(id)sender {
    [self dismissViewControllerAnimated:NO completion:nil];
}

然后在firstDC中再次使用动画在viewDidAppear中解散,在测试控制器未显示之后:

-(void)viewDidAppear:(BOOL)animated {
    if (![self isBeingPresented]) {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

虽然上面的代码可以回到初始控制器的视图,但是你会看到firstVC的视图出现在curl uncurls之前。如果你不想看到它,那么我找到解决这个问题的唯一方法就是创建一个secondVC的图像,在解除secondVC之前将其作为(在图像视图中)添加到firstVC。所以,要做到这一点,secondVC中的代码应该是这样的(请注意,您必须链接到QuartzCore并将其导入secondVC才能使其工作):

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIImage *img = [self imageWithView:self.view];
    FirstViewController *first = (FirstViewController *)self.presentingViewController;
    UIImageView *iv = [[UIImageView alloc] initWithFrame:first.view.bounds];
    iv.image = img;
    [first.view addSubview:iv];
}


-(IBAction)dismissSelf:(id)sender {
    [self dismissViewControllerAnimated:NO completion:nil];
}


- (UIImage *)imageWithView:(UIView *)view {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

答案 1 :(得分:3)

您应该通过以下呼叫一个接一个地展示您的两个观点:

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

    }];
}];

这应该表现得更好。此外,要知道您必须在之后关闭这两个viewControllers。

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

    }];
}];

答案 2 :(得分:2)

看起来你在不解雇'第二'的情况下解雇'第一'。

Apple建议的方法是委托。

尝试使mainVC成为'first'的委托,这样首先可以调用mainVC的方法来解散自己。通过声明'first'的'delegate'属性并在'first'实例化时将其设置为mainVC来执行此操作。然后在first.h中定义一个'firstDelegate'协议,其中包含一些函数,如'dismissFirst',然后在mainVC中导入first.h。现在在mainVC中实现dismissFirst实际上解除'first'并做任何你想要的事情,首先要显示它。

喘气......现在以同样的方式让'第一'成为'第二'的代表,只需让'dismissSecond'函数调用mainVC的'dismissFirst'功能,所有这些功能都适合全世界。

我知道这很复杂,但委托是iOS的核心概念,这是使用它的典型例子。

以下是对其工作原理的一个很好的解释。 http://chrisrisner.com/31-Days-of-iOS--Day-6%E2%80%93The-Delegate-Pattern

我祝你好运,不要忘记了解苹果工程师心灵的内在阴谋,也就是所谓的Obj-C。

答案 3 :(得分:0)

我也有同样的疑问。我用其他方式解决了 -

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

@property (nonatomic) int flag;

第2步:假设您需要关闭second view controllerfirst view controller并返回Main view controller,同时关闭第二个视图控制器,您可以将此值设置为假设1 即可。

[[Global sharedObject] setFlag:1];
[self.navigationController popViewControllerAnimated:YES];

第3步:使用- (void)viewWillAppear:(BOOL)animated的{​​{1}}方法,您可以设置此方法 -

first view controller

我希望你的回答能够解决。如果你仍然有疑虑,你可以问。干杯:)

答案 4 :(得分:0)

- (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];
    }
}

答案 5 :(得分:0)

您需要使用unwind segue。在要切换到的视图控制器中创建一个“空”IBAction。

@IBAction func unwindToController(segue: UIStoryboardSegue) {

}

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

FROM控制器中将出现一个新的“Unwind segue to Exit”。双击它并给它一个标识符,例如unwindIdentifier

现在,当您要在FROM控制器中展开两个控制器时,请使用:

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

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