如何在不知道新的 VC 的情况下将 ViewController 呈现在另一个之上?

Posted

技术标签:

【中文标题】如何在不知道新的 VC 的情况下将 ViewController 呈现在另一个之上?【英文标题】:How do I present a ViewController over another with that VC having no knowledge of the new one? 【发布时间】:2014-10-16 22:12:16 【问题描述】:

我有一个方法可以做到这一点,但它在某个时候停止了工作。

这里的动机是为了调试。我有一个按钮,显示来自 VC 调用的调试操作表。这很好用。然而,在行动表中,当我选择一个之后,想要的行动在某些情况下是新 VC 的介绍。第一个示例是显示我的内部日志的 VC。当不在“tethered”模式下调试时,它非常有价值。

每个调试 VC 在主故事板中都表示为一个场景。我用 instantiateViewControllerWithIdentifier: 实例化 VC。然后我试图把它呈现出来。

棘手的部分是必须呈现新的 VC,然后将其关闭,而无需在当前活动的 VC 中编写任何代码。我也不想从每个可能调用它的 VC 中创建一个 Segue。重点是 DebugActionSheet 是自包含的,除了启动它的单个调用。

【问题讨论】:

查看这个 github 项目:github.com/ipodishima/PPTopMostControllerMarian 制作了一个 UIViewController 类别,允许您调用 [UIViewController topMostController] 并返回活动的 UIViewController。 【参考方案1】:

您应该能够像这样从您的 ActionSheet 委托方法访问最顶层的视图控制器。

+ (UIViewController*) topMostController

    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

    while (topController.presentedViewController) 
        topController = topController.presentedViewController;
    

    return topController;

然后在调用代码中:

[MyDebugController.topMostController presentViewController:myLoggingView
                 animated:YES
               completion:nil];

而你的myLoggingView 可以通过调用

自行关闭
[self.presentingViewController  dismissViewControllerAnimated:YES
                       completion:nil]

尝试在主线程上呈现它?

dispatch_async(dispatch_get_main_queue(), ^ 
    [self presentViewController:vc animated:YES completion:nil];
);

【讨论】:

这是以前工作的变体。我收到“警告:尝试在 上呈现 已经呈现(空)”。【参考方案2】:

原来我的问题是当前顶部控制器使用的是导航控制器,因此所需的代码不同。

UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
_paletteVC = [story instantiateViewControllerWithIdentifier:@"PaletteDisplayVC"];

[[_delegate navigationController] pushViewController: _paletteVC
                                            animated: YES];

我将当前的***控制器作为委托传递给我的 DebugActionSheet,因此我不需要上面的 topMostController 方法。但是,我认为它也可以使用。

【讨论】:

以上是关于如何在不知道新的 VC 的情况下将 ViewController 呈现在另一个之上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道格式的情况下将字符串转换为日期?

如何在不知道编码的情况下将字节写入 Python 3 中的文件?

Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC

如何在不知道宽度的情况下将元素存储在二维向量中?

你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?

如何在不知道 $row 像 phpmyadmin 的情况下将 mysql 表数据输出到 html 表中