19

更新:
我又遇到了这个问题,找到了另一种方法。如果显示控制器没有嵌入到导航控制器中,如果显示的控制器不是全屏的,它将被隐藏并变黑。方法 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 的视图控制器。从这个表中显示详细视图,将能够显示消息框。消息框必须是另一个视图控制器。并且当显示消息框时,所有前面的两个控制器都消失了。这就是问题所在。

4

6 回答 6

17

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

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)
}
于 2015-06-30T17:46:54.543 回答
11

关闭当前视图控制器上方的所有视图控制器。

苹果的文档如下:

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

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

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

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

于 2014-05-09T13:47:03.793 回答
10

这个答案可能看起来有点不合常规,但它确实有效。它允许您“打开多个模式”,但一次只显示一个。关键是只有一个 modal,但是使用Tab Bar Controller在View Controller之间切换。

多模态

  1. 将您的模态序列从蓝色(呈现)视图控制器连接到模态容器(这只是一个常规视图控制器
  2. 模态容器只包含一个Container View,其唯一目的是嵌入一个Tab Bar Controller
  3. 容器视图中嵌入标签栏控制器
  4. 每个选项卡都可以是一个单独的View Controller,代表“多模态”
  5. Tab Bar ControllerTab Bar设置为隐藏
  6. 在模态之间切换使用tabBarController?.selectedIndex = 1
  7. 正常关闭模态dismissViewControllerAnimated(true, completion: nil)

它看起来像这样:

在此处输入图像描述

于 2015-08-10T19:15:49.500 回答
5

尝试实现这一目标的简单方法是创建您想要以模态方式呈现的 VC,并一个接一个地呈现。不幸的是,这行不通。你得到的只是第一个 VC 提出的,其他的都无处可去。UIKit 只是不会在这里与您合作。

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2013-11-04T04:53:58.950 回答
1

AND本身modalPresentationStyle上设置正确。navigationControllerviewController

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

[self presentViewController:vcToPresent animated:YES completion:^{
    self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`
于 2015-12-02T19:08:06.443 回答
0

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

    let transition: CATransition = CATransition()
    transition.duration = 0.5
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = kCATransitionReveal
    transition.subtype = kCATransitionFromBottom
    self.view.window!.layer.add(transition, forKey: nil)
    self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)
于 2018-02-28T01:04:01.770 回答