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

===============>>#1 票数:0

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

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

因此,在您的代码行中:

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

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

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

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

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

希望对您有帮助。

  ask by user4486205 translate from so

未解决问题?本站智能推荐: