如何在不知道新的 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];
);
【讨论】:
这是以前工作的变体。我收到“警告:尝试在原来我的问题是当前顶部控制器使用的是导航控制器,因此所需的代码不同。
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