模态视图控制器,dismiss和pop回视图控制器

6

我正在尝试关闭一个名为CModalViewController,回到AModalViewController是在B中呈现的。因此,导航流程是 A->B - (显示模态视图) -> C。我能够将ModalViewController关闭回到B,但我无法在完成括号中返回到A。这是我尝试过的代码:

[self dismissViewControllerAnimated:YES completion:^{
    [self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:0] animated:YES];
}];

ModalViewController被解除了,但没有弹回到A。我在一个IBAction中调用了这段代码。

有什么建议吗?

另外,当我解除ModalViewController时,Controller B中所有的UIPickers都是空的/被释放了。我也使用了ARC。


这个方法在哪个控制器中被调用?A、B还是C? - Durican Radu
@DuricanRadu 这被称为 C,它是 ModalViewController。 - DevC
2个回答

12
您的代码问题在于self.navigationController将为nil。如果您有一个嵌入导航控制器的控制器(A),并且该控制器推送到另一个控制器(B),然后呈现最后一个控制器(C),那么您需要像这样做:
-(IBAction)dismissToBThenPop:(id)sender {
    UINavigationController *nav = (UINavigationController *)self.presentingViewController;
    [self dismissViewControllerAnimated:YES completion:^{
        [nav popViewControllerAnimated:YES];
    }];
}
尽管您将C从B呈现出来,但实际的presentingViewController将是导航控制器。这段代码将解散C,然后弹出B,但您将在弹回A之前看到B的瞬间。如果您不想看到这个,那么应该使用一个取消转场动作从C直接返回A。
关于选取器为空并被释放的第二个问题,根据您所说的情况,不应该发生。您需要提供更多有关在B中正在做什么的信息来解决该问题。

0
在ModalViewController中创建一个协议,比如说ModalViewControllerDelegate,并添加一个方法-(void)dismissTheModal。然后让B实现这个协议。在显示ModalViewController之前,设置modalViewController.delegate = self。当你的IBAction被调用时,执行[self.delegate dismissTheModal]。在控制器B中,你应该这样做:
 -(void)dismissTheModal {
     [self dismissViewControllerAnimated:YES completion:^{
         [self popViewController];
  }];  

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