我有两个以模态方式呈现的视图控制器。
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?
答案 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