我正在尝试使用URL Scheme从AppDelegate
呈现一个viewcontroller。在URL方案的代码中,我有以下代码来呈现UIViewController
:
NSString *deviceType = [UIDevice currentDevice].model;
UIStoryboard *storyboard;
if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPhone Simulator"])
{
storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
} else if([deviceType isEqualToString:@"iPad"] || [deviceType isEqualToString:@"iPad Simulator"])
{
storyboard = [UIStoryboard storyboardWithName:@"Storyboard-iPad" bundle:nil];
}
MainVC *viewController = [storyboard instantiateViewControllerWithIdentifier:@"MainVC"];
viewController.number = number;
viewController.url = YES;
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]]) {
activeController = [(UINavigationController*) activeController visibleViewController];
}
[activeController presentModalViewController:viewController animated:YES];
当应用程序首次通过url方案启动时,这可以正常工作。但是,当应用程序在后台运行并通过URL启动时,它不起作用。造成这种情况的原因是什么?
答案 0 :(得分:0)
正如你所说它在第一次运行时有效,我认为这是因为你的根视图控制器是你需要的导航控制器。
但是,让我们说在使用应用程序期间,您几乎没有导航队列和演示新视图控制器。那么当你从应用程序顶层视图控制器进入后台时,它不是你认为是activeController
的根。
所以在你的代码中行:
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController;
只是意味着您将访问根(队列中的第一个视图控制器),但是如果您在使用应用程序时进行了一些演示或推送,则需要最后一个视图控制器。
所以我认为这有两种方法:
所以你应该考虑你的控制器 示例书堆。因此,如果您的书籍堆数等于10并且您想要从第6本书中出示新书,则需要先删除4本顶级书籍,然后再将新书翻出来。或者你可以找到第10本书并将11本书放在10本书上(这似乎是你的MainVC)。也许这是一个粗略的例子,但是您应该从可以提供新视图控制器的位置找到点,或者如果它已经呈现,那么您需要从队列中删除呈现/推送的视图控制器。
希望对你有所帮助。