【问题标题】:How do I present a ViewController over another with that VC having no knowledge of the new one?如何在不知道新的 VC 的情况下将 ViewController 呈现在另一个之上?
【发布时间】:2014-10-16 22:12:16
【问题描述】:
我有一个方法可以做到这一点,但它在某个时候停止了工作。
这里的动机是为了调试。我有一个按钮,显示来自 VC 调用的调试操作表。这很好用。然而,在行动表中,当我选择一个之后,想要的行动在某些情况下是新 VC 的介绍。第一个示例是显示我的内部日志的 VC。当不在“tethered”模式下调试时,它非常有价值。
每个调试 VC 在主故事板中都表示为一个场景。我用 instantiateViewControllerWithIdentifier: 实例化 VC。然后我试图把它呈现出来。
棘手的部分是必须呈现新的 VC,然后将其关闭,而无需在当前活动的 VC 中编写任何代码。我也不想从每个可能调用它的 VC 中创建一个 Segue。重点是 DebugActionSheet 是自包含的,除了启动它的单个调用。
【问题讨论】:
标签:
ios
objective-c
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 方法。但是,我认为它也可以使用。