2014-10-16 19 views
1

我有一个方法来做到这一点,但它在某个时候停止了工作。如何使用不知道新控件的VC来向另一个控件显示ViewController?

这里的动机是调试。我有一个按钮,显示VC调用它的调试操作表。这很好。但是,在操作表中,我选择了一个后,需要的操作是在某些情况下显示一个新的VC。第一个例子是一个显示我内部日志的VC。如果不以“连接”模式进行调试,这非常有价值。

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

棘手的部分是,新的VC必须呈现,然后在没有编写任何当前活动的VC代码的情况下解散。我也不想从每个可能被调用的VC创建一个Segue。整个观点是DebugActionSheet是自包含的,除了单个调用来启动它。

+1

查看此github项目:https://github.com/ipodishima/PPTopMostController Marian制作了一个UIViewController类别,允许您调用[UIViewController topMostController],它将返回活动的UIViewController。 – 2014-10-16 23:12:18

回答

0

原来我的问题是,当前最高层控制器正在使用导航控制器,所以所需的代码是不同的。

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

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

我目前最大的控制器传递给我的DebugActionSheet为代表,所以我不需要上述topMostController方法。不过,我认为它也可以。

0

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

+ (UIViewController*) topMostController 
{ 
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; 

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

    return topController; 
} 

然后在调用代码:

通过调用

[self.presentingViewController dismissViewControllerAnimated:YES 
         completion:nil] 

尝试提出它在主线程

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

和你myLoggingView可以辞退自己?

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

这是以前工作的变体。我得到“警告:尝试在上呈现,它已经呈现(null)”。 – LostInTheTrees 2014-10-17 16:36:19

+0

尝试调度演示文稿到主线程? – 2014-10-17 17:07:19

+0

日志显示它已经在主线程中 – LostInTheTrees 2014-10-17 17:58:47

相关问题