目前有多个模态视图控制器?

时间:2013-11-01 09:37:40

标签: ios iphone objective-c uiviewcontroller presentmodalviewcontroller

更新
我再次面对这个问题,并找到了另一种方式。如果呈现控制器未嵌入导航控制器中,则如果呈现的控制器不是全屏并且将变为黑色,则将隐藏它。方法setModalPresentationStyle:UIModalPresentationCurrentContext只能应用于导航控制器。因此,在UINavigationController中嵌入呈现控制器,将UIModalPresentationCurrentContext设置为它并呈现新控制器 - 您将获得对话框控制器。

我正在呈现搜索控制器,它具有推送堆栈详细控制器的tableView。

详细控制器可以显示带有消息的视图控制器,它由小UIView和半透明背景组成。

问题:当最后一个视图控制器出现时,它下面的所有视图控制器都变为隐藏状态,控制器显示搜索控制器变为可见。

我在做什么:

SearchViewController *viewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
viewController.data = dataArray;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
[self.navigationController presentViewController:navigationController animated:YES completion:nil];

比表推送详细视图:

DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[viewController setHidesBottomBarWhenPushed:YES];
viewController.dataItem = [data objectAtIndex:(NSUInteger) [indexPath row]];
[self.navigationController pushViewController:viewController animated:YES];

详细视图显示消息框:

MessageController *controller = [[MessageController alloc] initWithNibName:@"MessageController" bundle:nil];
controller.message = message;
[self presentViewController:controller animated:YES completion:nil];

当它被解雇时,其下的所有控制器都变得可见。

更新

我想要的是以模态方式呈现一个具有uitableview的视图控制器。从此表中显示将能够显示消息框的详细视图。消息框必须是另一个视图控制器。当显示消息框时,所有前两个控制器都会消失。这就是问题。

6 个答案:

答案 0 :(得分:10)

关闭所呈现的视图控制器上方的所有视图控制器。

Apple的文档如下:

  

如果您连续呈现多个视图控制器,从而构建一堆呈现的视图控制器,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图上方的所有视图控制器。发生这种情况时,只有最顶层的视图以动画方式被删除;任何中间视图控制器都可以从堆栈中删除。最顶层的视图使用其模态过渡样式被忽略,这可能与堆栈中较低的其他视图控制器使用的样式不同。

关闭两个模态视图控制器。

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#jumpTo_51

答案 1 :(得分:10)

在某些情况下,您可以让每个模态呈现的视图控制器呈现下一个。

let window = UIApplication.sharedApplication().keyWindow!
if let modalVC = window.rootViewController?.presentedViewController {
    modalVC.presentViewController(vc, animated: true, completion: nil)
} else {
    window.rootViewController!.presentViewController(vc, animated: true, completion: nil)
}

答案 2 :(得分:8)

这个答案似乎有些不同寻常,但它确实有效。它可以让你打开多个模态",但一次只显示一个。关键是只有一个模态,但使用标签栏控制器视图控制器之间切换。

multiple modals

  1. 将您的模态segue从蓝色(显示)查看控制器连接到模态容器(只是常规视图控制器
  2. 模态容器只包含容器视图,其唯一目的是嵌入标签栏控制器
  3. 容器视图
  4. 中嵌入标签栏控制器
  5. 每个标签可以是单独的视图控制器,代表"多个模式"
  6. 标签栏控制器标签栏设置为隐藏
  7. 使用tabBarController?.selectedIndex = 1
  8. 在模态之间切换
  9. 使用dismissViewControllerAnimated(true, completion: nil)
  10. 正常关闭模式

    它看起来像这样:

    enter image description here

答案 3 :(得分:4)

  

尝试实现这一目标的微不足道的方法就是创建风险投资   你想以模态呈现并一个接一个地呈现。   不幸的是,这不会奏效。你得到的只是第一个   VC呈现,其他所有人都无处可去。 UIKit只是不合作   和你在一起。

http://xissburg.com/presenting-multiple-modal-view-controllers-at-once/

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

答案 4 :(得分:1)

上设置正确的modalPresentationStyle navigationControllerviewController本身。

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
vcToPresent.preferredContentSize = CGSizeMake(650, 450);

[self presentViewController:vcToPresent animated:YES completion:^{
    self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`

答案 5 :(得分:0)

我找到了一个解决方案:提供自己的自定义动画:

reject()