繁体   English   中英

无法通过URL方案显示ViewController

[英]Can't present viewcontroller through URL scheme

我正在尝试通过URL方案提供来自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启动时,它将无法正常工作。 是什么原因造成的?

正如您所说的,它在第一次运行时有效,我想是因为您的根视图控制器是一个导航控制器,您似乎需要它。

但是,可以说,在使用应用程序期间,您几乎没有导航队列和演示新的视图控制器的队列。 因此,当您从应用程序进入后台时,顶视图控制器不是您想作为activeController的根。

因此,在您的代码行中:

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

只是意味着您将访问根目录(队列中的第一个视图控制器),但是您需要最后一个视图控制器,以防在使用应用程序时出现一些演示或推送。

所以我认为这是两种方法:

  • 找到顶视图控制器并从中进行演示。
  • 关闭一个队列/控制器堆栈(例如将其关闭或弹出),然后从需要的位置显示MainVC。

因此,您应该考虑您的控制器,例如EXAMPLE堆栈。 因此,如果您的书籍堆积数量等于10,并且您想从第6本书开始展示新书,则需要先丢弃4本书,然后再放置新书。 或者,您只可以找到第10本书,然后将11本书放在10本书之上(这似乎是您的MainVC)。 也许这是一个粗糙的示例,但是您应该从可以显示新视图控制器的位置找到一个点,或者如果已经存在,则需要从队列中删除显示/推送的视图控制器。

希望对您有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM