【问题标题】:Dismiss multiple ModalViewControllers iOS关闭多个 ModalViewControllers iOS
【发布时间】:2013-01-30 20:03:14
【问题描述】:

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

App 加载 View A,它是一个带有 navigationController 的 Tableview。延迟后,我呈现了一个 ModalView B。在视图 B 上,我有一个按钮,在视图 B 上方呈现另一个 modalView 视图 C。在模态视图 C 中,我有一个关闭 C 的按钮。现在当我点击这个按钮时,我也想关闭 Modal视图 B 将我带回我的 RootView,即提到的 tableView 视图 A。

在模态视图 C 中,我有一个按钮,但只能使用以下操作关闭 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 之外,它们都没有做任何事情。

【问题讨论】:

  • 给您的问题:是否有任何时候在呈现视图 C 时您不希望视图 B 与 C 同时被关闭?
  • @DanF 只要显示视图 C,B 就可以被丢弃...
  • 那么,当你呈现 C 时,为什么不关闭带有/不带有动画的 B 呢?
  • 你的意思是在视图 B 中呈现 C 的动作同时解除 B 像这样 [self presentModalViewController:viewControllerC animated:YES]; [self dismissModalViewControllerAnimated:YES];//Dismiss B?
  • 刚试了一下,没有任何作用 B 永远不会被删除?

标签: ios uiviewcontroller uinavigationcontroller modalviewcontroller presentmodalviewcontroller


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了,我的层次结构不会改变,所以这是完美的,非常感谢!!
  • 非常感谢您的详细解释,现在我明白了
【解决方案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:dismissViewControllerAnimated:completion:

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      相关资源
      最近更新 更多