如何连续关闭2个模态视图控制器?

时间:2010-07-11 19:20:13

标签: iphone objective-c cocoa-touch uikit uiviewcontroller

我有两个以模态方式呈现的视图控制器。

A presents B which presents C.

当我解雇C时,我也想解雇B.但我不知道该怎么做:

解雇C:

[self dismissModalViewControllerAnimated:YES]
//[delegate dismissB] //this doesn't work either when i create a delegate pattern

现在我离开了B.如何从C中解雇B?

15 个答案:

答案 0 :(得分:108)

刚刚发现你需要在iOS 5中使用presentViewController。

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];

A - > B - > ç

在模态C中运行上述代码将带您回到A

答案 1 :(得分:14)

这对我有用,非常简单

// Call inside View controller C    
self.presentingViewController?.dismissViewControllerAnimated(false, completion: nil)
self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

说明:

如果你在C上调用dismiss,它只能删除C.如果你在B上调用dismiss,它会做正确的事:删除最顶层的模态视图控制器。因此第一个调用删除C(没有动画)。第二个调用删除B.

从C访问视图控制器B的最简单方法是使用presentsViewController变量。

答案 2 :(得分:12)

在B. Put:

[self dismissModalViewControllerAnimated:NO];
[self dismissModalViewControllerAnimated:YES];

只运行一个动画。

答案 3 :(得分:9)

尝试使用B中的下一个代码(正如您已经解雇C一样):

[self.parentViewController dismissModalViewControllerAnimated:YES];

重要
在此行之后的方法中不要做任何事情。
这个视图控制器(B)可能会被释放并解除分配......

更新的:
从iOS7开始,不推荐使用上述方法 请改用下一个方法:

[self.parentViewController dismissViewControllerAnimated:YES completion:^{ /* do something when the animation is completed */ }];

答案 4 :(得分:6)

选中swift:

self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil);

答案 5 :(得分:4)

在swift 4中

self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil);

答案 6 :(得分:2)

您只需要一个解雇命令。只要解雇B,然后C就会消失。

答案 7 :(得分:2)

这对我有用:

// Swift
presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

// Objective-C
[self.presentingViewController dismissViewControllerAnimated:true completion:nil];

答案 8 :(得分:2)

我阅读了所有主题,但我找不到合适的答案。如果你解雇B,那么C会立即消失并产生一种奇怪的效果。正确的方法是将C作为子视图控制器从底部呈现自定义动画,如:

   [b addChildViewController:c];
    c.view.frame = CGRectOffset(b.view.bounds, 0, b.view.bounds.size.height);
    [b.view addSubview:c.view];
    [c didMoveToParentViewController:b];

    [UIView animateWithDuration:0.5 animations:^{
        c.view.frame = CGRectOffset(c.view.frame, 0, -b.view.bounds.size.height);
    } completion:^(BOOL finished) {

    }];

然后你只是解雇B而且看起来好多了!

答案 9 :(得分:0)

导航控制器有一个“viewControllers”属性,它是一个数组 - 您可以将其设置为一个新数组,减去要删除的两个视图控制器。

答案 10 :(得分:0)

受到Albertos解决方案的启发,我在B中创建了一个委托方法,其中有一个块来显示删除帐户的结果:

#pragma - mark - AddAccountViewControllerDelegate Methods

- (void) dismissToSettings {
    [self dismissModalViewControllerAnimated:NO];
    [self dismissViewControllerAnimated:YES completion:^(void){[DKMessage showMessage:LS(@"Account was successfully created")];}];
}

答案 11 :(得分:0)

我遇到了同样的问题,更好的解决方案是创建一个“DismissViewProtocol”,如下所示:

文件:DismissViewProtocol.h

@protocol DismissViewProtocol <NSObject>
-(void)dismissView:(id)sender;
@end

在我的B模式视图中,让我们对委托方法做出回应:

在我的b.h文件中

#import "DismissViewProtocol.h"
@interface B-Modal : UIViewController <DismissViewProtocol>
...
@end

在我的b.m文件中:

-(void) dismissView:(id)sender
{
 [((UIViewController *) sender) dismissModalViewControllerAnimated:NO];
 [self dismissModalViewControllerAnimated:YES];
}

在同一个B视图控制器中,当我打电话给 接下来,在我的B模态视图中,当我调用其他模态视图C时,假设对于segue:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    ((C-ViewController *)segue.destinationViewController).viewDelegate=self;
}

最后,在我的c.h文件中,让我们为代理做准备:

@property(nonatomic, weak) id <DismissViewProtocol> viewDelegate;

在我的c.m文件中,我只是告诉我的viewDelegate解除我的模态视图控制器及其自身:

-(void)closeBothViewControls
{
       [self.viewDelegate dismissView:self];
}

就是这样。

希望它适用于所有人。

答案 12 :(得分:0)

这是一种如何使用重复周期解除多个模态视图控制器的方法:

Swift 3

// In this example code will go throw all presenting view controllers and 
// when finds it then dismisses all modals.
var splitViewController: UIViewController? = self

repeat {
    splitViewController = splitViewController?.presentingViewController
} while (!(splitViewController is UISplitViewController) && (splitViewController != nil))

splitViewController?.dismiss(animated: true, completion: nil)

答案 13 :(得分:0)

我知道这个答案可能有点多余,但是下面的陈述应该是有道理的  这样您就会知道它是如何工作的。

只需解开最旧的视图控制器,其他所有随后的视图控制器都将与此无关。

如果有2个视图控制器:

目标C:

[self.presentingViewController dismissViewControllerAnimated:true completion:nil]

迅速:

presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

答案 14 :(得分:0)

我找到了解决方案。

您可以将这些ViewControllers放在单独的NavigationController中。并且比关闭NavigationController还要使所有这些ViewControllers立即消失。

https://gist.github.com/ufo22940268/2949fdf59c9860292f263ebb1e8036d7