关闭多个ModalViewControllers iOS

时间:2013-01-30 20:03:14

标签: ios uiviewcontroller uinavigationcontroller modalviewcontroller presentmodalviewcontroller

好的,我知道有很多关于这个主题的信息,但是我所尝试的一切都不起作用。我的设置就是这个。

App加载View A,它是一个带有navigationController的Tableview。延迟后,我提出了一个ModalView B.在视图B上我有一个按钮,在视图B上方显示另一个模态视图C.在模态视图中CI有一个按钮来消除C.现在,当我按下这个按钮时,我也想要消解模态视图B将我带回我的RootView,这是提到的tableView视图A.

从模态视图CI有一个按钮,但只能使用下面的动作来解除C这需要我进入模态视图B:我想要做的是用这个按钮删除C和B,如果可能的话,将我返回给A?

-(IBAction)dismissWebView:(id)sender{

[self dismissModalViewControllerAnimated:YES];

}

我已经从上面的行动中尝试了所有这些

[self.parentViewController dismissModalViewControllerAnimated:YES];
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
[adsRootView dismissModalViewControllerAnimated:YES];
[self dismissModalViewControllerAnimated:YES];
[self dismissModalViewControllerAnimated:YES];
[self.navigationController dismissModalViewControllerAnimated:YES];
[self.adsRootView dismissModalViewControllerAnimated:YES];
[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES];
[self.navigationController popToRootViewControllerAnimated:NO];

除了仅解除模态视图C之外,其中任何一项都没有。

3 个答案:

答案 0 :(得分:5)

所以简单的方法是到达你的A控制器,在这种情况下不是父子关系,而是呈现/呈现的关系:

[self.presentingViewController.presentingViewController dismiss...]
 ^C   ^B                       ^A

但是,这不是很干净,当你改变你的控制器层次结构时会得到你,所以我建议设置一个委托来通知什么时候可以解雇控制器。

答案 1 :(得分:2)

我认为视图控制器通过调用self.presentingViewController来有效地解散自己是不好的做法。我一直使用委托协议来允许呈现的视图控制器通知呈现视图控制器是否点击了取消或完成按钮(或询问其他信息)。

为了解释这个例子,C会定义一个协议,允许它在点击按钮时通知B:

@protocol CViewControllerDelegate
- (void)cViewControllerDidSelectDone:(CViewController *)viewController;
@end

C具有delegate属性:

@property (weak, nonatomic) id <CViewControllerDelegate> delegate;

B视图控制器具有类似的委托和协议(尽管方法名称可能不同,因为没有“完成”按钮)。

A采用BViewControllerDelegate协议,当它呈现B时,它将自己设置为委托。类似地,B采用CViewControllerDelegate协议,当它呈现C时,它将自己设置为委托。

C中的按钮处理程序只调用委托:

[self.delegate cViewControllerDidSelectDone:self];

B中该方法的处理程序解除C视图控制器并通知其委托人(A):

- (void)cViewControllerDidSelectDone:(CViewController *)viewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
    [self.delegate bViewControllerDidSelectDone:self]
}

B委托方法的A处理程序只是驳回了B:

- (void)bViewControllerDidSelectDone:(BViewController *)viewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

这种编码风格有助于分离不同的视图控制器,并确保同一个类负责呈现和解除另一个视图控制器。

最后一点,presentModalViewControllerdismissModalViewControllerAnimated:在iOS 6.0中已弃用。只要您不需要在iOS 5.0之前支持版本,最好使用presentViewController:animated:completion:dismissViewControllerAnimated:completion:

答案 2 :(得分:0)

对于那些正在寻找Swift代码的人:

self.presentingViewController!.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)