模态视图控制器,关闭并弹回视图控制器
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];
];
【讨论】:
以上是关于模态视图控制器,关闭并弹回视图控制器的主要内容,如果未能解决你的问题,请参考以下文章