【问题标题】:Present multiple modal view controllers?呈现多个模态视图控制器?
【发布时间】:2013-11-12 12:00:54
【问题描述】:

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

【问题讨论】:

  • 很难理解您所描述的问题以及您希望它做什么。建议您添加屏幕截图或图片,以更好地描述您需要帮助的问题。

标签: ios iphone objective-c uiviewcontroller presentmodalviewcontroller


【解决方案1】:

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

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】:

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

    Apple 的文档如下:

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

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

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

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

    【讨论】:

    • 文档中没有这样的文字。请更新你的答案
    • 文档在这里:developer.apple.com/reference/uikit/uiviewcontroller/…。我不相信文档是正确的;似乎最顶层的视图和中间的低视图在没有动画的情况下被关闭,然后调用 dismissViewControllerAnimated: 的视图被动画关闭
    • 我不确定作者的意思以及为什么其他用户投票支持它,但让我告诉你我测试过的内容:我将 VC1 呈现为 MainVC 的模态。之后,我将 VC1 中的 VC2 也作为模态呈现。几秒钟后,我关闭了 VC1,而 VC2 保持不变,没有任何变化。值得一提的是,VC1 和 VC2 有一个嵌入式 NavBar,但同样,两者都以模态形式呈现,而不是推送到堆栈。
    【解决方案3】:

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

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

    看起来像这样:

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 现在似乎更好的方法(而不是使用图像)是在呈现视图控制器之前设置self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext,然后在完成处理程序中重置值。见stackoverflow.com/a/15794051/339925
      【解决方案5】:

      navigationControllerviewController 本身两个上设置正确的modalPresentationStyle

      self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
      vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
      vcToPresent.preferredContentSize = CGSizeMake(650, 450);
      
      [self presentViewController:vcToPresent animated:YES completion:^{
          self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
      }];`
      

      【讨论】:

        【解决方案6】:

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

            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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-03
          • 2011-01-15
          • 2011-06-21
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多