模态视图控制器,关闭并弹回视图控制器

Posted

技术标签:

【中文标题】模态视图控制器,关闭并弹回视图控制器【英文标题】:Modal View Controller, dismiss and pop back to view controller 【发布时间】:2014-04-02 15:46:21 【问题描述】:

我试图关闭一个名为 C 的 ModaViewController,返回到 A。 ModalViewController 在B 中提供。因此导航流程是 A->B - (present ModalView) -> C。我可以将 ModalViewController 解散回 B,但我无法在完成括号中弹回 A。这是我尝试过的代码:

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

ModalViewController 被解除,但不会弹回 A。我在 IBAction 中调用此代码块。

有什么建议吗?

第二点,当我关闭 ModalViewController 时,控制器 B 中的所有 UIPickers 都是空的/已释放。我也在使用 ARC。

【问题讨论】:

这个方法,在哪个控制器中调用? A、B 还是 C? @DuricanRadu 它在 C 中被调用,它是 ModalViewController 【参考方案1】:

您的代码的问题是 self.navigationController 将为零。如果您在导航控制器中嵌入了一个控制器 (A),并且该控制器推送到另一个控制器 (B),然后该控制器呈现您的最后一个控制器 (C),那么您需要执行这样的操作,

-(IBAction)dismissToBThenPop:(id)sender 
    UINavigationController *nav = (UINavigationController *)self.presentingViewController;
    [self dismissViewControllerAnimated:YES completion:^
        [nav popViewControllerAnimated:YES];
    ];

即使您从 B 呈现 C,实际呈现的 ViewController 将是导航控制器。此代码将关闭 C 然后弹出 B,但您会在 ut 弹回 A 之前看到 B 片刻。如果您不想看到这个,那么您应该使用 unwind segue 直接从 C 返回到 A。

在您所说的情况下,您的第二个问题不应该发生在您说的情况下。您必须提供更多信息,说明您在 B 中为解决该问题所做的工作。

【讨论】:

【参考方案2】:

在 ModalViewController 中创建一个协议,假设 ModalViewControllerDelegate 带有方法 -(void)dismissTheModal,并让 B 实现该协议。在显示 ModalViewController 之前,请执行 modalViewController.delegate = self。当您调用 IBAction 时,执行 [self.delegate dismissTheModal],然后在控制器 B 中执行:

 -(void)dismissTheModal 
     [self dismissViewControllerAnimated:YES completion:^
         [self popViewController];
  ];  

【讨论】:

以上是关于模态视图控制器,关闭并弹回视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从模态弹出到根视图控制器

关闭模态视图控制器后呈现不同的视图控制器

我怎样才能呈现一个模态视图控制器,并带有默认的关闭动画?

将模态呈现的视图控制器关闭到不同的底层视图控制器

关闭从模态呈现的视图控制器翻转的视图控制器

在拆分视图中模态关闭 MWPhotoBrowser 视图控制器