解雇模态及其调用者

时间:2013-10-21 07:34:14

标签: ios storyboard modal-dialog

很抱歉,但类似的问题都没有提供可行的解决方案。

新的单一视图项目。 故事板操作:

  • VC1嵌入在nav-controller
  • VC1中的按钮激活推送设置到VC2
  • VC2中的按钮将模态 segue激活为VC3
  • VC3有一个按钮, UIViewController-subclass 用于处理按钮操作

问题陈述:如何让模态VC3的按钮立即关闭两者 VC3和VC2,将我带回VC1?

这不起作用 - 只带我去VC2:

- (IBAction)dismissPressed:(id)sender {
    UINavigationController *myNavController = [self navigationController];
    [self dismissViewControllerAnimated:NO completion:^{
        [myNavController popToViewController:[myNavController.viewControllers objectAtIndex:1] animated:NO];
    }];
}

非常感谢!

3 个答案:

答案 0 :(得分:0)

使用 self.presentingViewController 找出“以前的视图控制器”。 您无需通过属性传递上一个视图控制器。

- (IBAction)dismissPressed:(id)sender {
    UIViewController *presentingViewController = self.presentingViewController;
    [self dismissViewControllerAnimated:NO completion:^{
        [self.presentingViewController popViewControllerAnimated:TES];
    }];
}

答案 1 :(得分:0)

好的,这是解决方案:

如果你可以限制自己使用ios6 +,正确的答案就是让按钮成为展开segue ,如What are Unwind segues for and how do you use them?

中所述

但如果你像我一样并且必须遵守ios5,解决方案就是这样:

在调用模态segue 的VC中声明一个这样的委托:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"segueModalVC"]) {
        ModalVC *vc = [segue destinationViewController];
        vc.prevVC = self;
    }
}

您必须#import目标模式VC的标头。

现在在模态VC中添加一个属性来保存前面的VC,如下所示:

@property (weak, nonatomic) UIViewController *prevVC;

现在按钮弹出两个VC的操作应如下所示:

- (IBAction)pressedMainMenu:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
    [[self.prevVC navigationController] popViewControllerAnimated:NO];
}

[已编辑显示完美版本的最终版本,可以将动画从VC3翻转回VC1。花了我几个小时来完成这个,但现在你可以免费享受它:)]

恕我直言,模态VC没有'本地'方法来访问其前面的VC是一个设计错误。

答案 2 :(得分:0)

尝试使用popToRootViewControllerAnimated方法返回VC1。

- (IBAction)dismissPressed:(id)sender {
    UINavigationController *myNavController = [self navigationController];
    [self dismissViewControllerAnimated:NO completion:^{
        [myNavController popToRootViewControllerAnimated: NO];
    }];
}