iOS 5中解除多个视图控制器

4
在iOS 4中,如果您想要关闭两个嵌套的模态视图控制器,可以使用以下代码:
[[[[self parentViewController] parentViewController] parentViewController] dismissModalViewControllerAnimated:YES];

然而,在 iOS 5 中,这种方法不再有效。有谁知道如何在 iOS 5 中实现此功能?


iOS 5会发生什么不同的事情?崩溃了吗? - Jesse Black
什么也没有发生。模态视图保持在原地。 - Andrew Lauer Barinov
3个回答

11

如果您在呈现第一个模态视图的视图控制器上调用dismissViewControllerAnimated:,则会同时关闭两个模态视图。因此,在第二个模态视图中,您需要执行以下操作:

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

8
我有一个应用程序,通过NSNotificationCenter关闭嵌套的模态视图控制器。通知被我想要返回到的VC接收,并且之间的所有VC都会消失。
在更深层的VC中...
NSNotification * notification = [NSNotification notificationWithName:@"BACKTOINDEXNOTE" object:nil];
[[NSNotificationCenter defaultCenter] postNotification:notification];

在VC中,我想要返回。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
   if (self) {
       [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismiss) name:@"BACKTOINDEXNOTE" object:nil];

       // more init code
   }
   return self;
}

-(void)dismiss
{
  [self dismissModalViewControllerAnimated:YES];
}

这适用于 iOS 5 设备,其项目已部署至 4.0+。希望能帮到你。如果你使用这个方法,在你当前 VC 和想要关闭的 VC 之间添加更多 VC,它将自动扩展而无需改变这段代码。


关闭模态视图控制器会自动关闭所有作为其子级的模态视图控制器。因此,它是可扩展的。我的意思是,如果mvc1呈现mvc2,mvc2呈现mvc3,而您关闭mvc1,则mvc2和3都将被关闭。 - George
@user624091 如果在self和“曾祖父”之间抛出另一个视图控制器,OP的代码将无法正确扩展。我的代码和OP的代码都利用了解除视图控制器可以解除多个控制器的事实。从我的经验来看,当请求视图控制器解除时,它将1)如果没有子项,则解除自身,2)解除所有子项(如果它们是以模态方式呈现的)。 - Jesse Black
非常有趣的解决方案。不要忘记iOS 5上的视图控制器也有presentedViewControllerpresentingViewController属性。还有一个dismissViewControllerAnimated:completion:,其中完成参数可以使用^block。 - Rog

0
在处理两个模态视图控制器的堆栈时,可以从初始视图控制器的委托方法中调用此方法,以便返回到下一个视图控制器并关闭所有已经呈现的视图控制器。
[self.presentedViewController.presentedViewController dismissViewControllerAnimated:NO completion:nil];
[self.presentedViewController dismissViewControllerAnimated:YES completion:nil];

显然这有点脆弱,因为如果您开始添加更多的模态窗口,那么事情就会崩溃。通常,如果您正在执行一堆控制器,则应使用UINavigationController,但对于几个模态窗口,这可以解决问题,并且比设置通知甚至更多的代理要简单得多!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接