0

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

应用程序加载 View A,它是一个带有 navigationController 的 Tableview。延迟后,我呈现了一个 ModalView B。在视图 B 上,我有一个按钮,在视图 B 上方呈现另一个 modalView View C。在 Modal View CI 中有一个关闭 C 的按钮。现在当我点击这个按钮时,我也想关闭 Modal视图 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 之外,它们都没有做任何事情。

4

3 回答 3

5

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

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

但是,这不是很干净,并且会在您更改控制器层次结构时得到您,所以我建议设置一个委托以通知何时可以关闭控制器。

于 2013-01-30T20:15:55.803 回答
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]
}

而 A 的 B 委托方法处理程序只是解雇 B:

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

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

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

于 2013-01-30T20:44:35.950 回答
0

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

self.presentingViewController!.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
于 2015-08-20T15:08:53.420 回答