当我的应用程序恢复时,我会在我的一个应用委托方法中找到最顶层的视图控制器(应用程序处于活动状态时最后显示的内容)。我知道它有效,因为调用viewDidLoad运行右视图控制器中的那个。
但是,如果最顶层的控制器是特定的几个视图控制器之一,我只想调用viewDidLoad。我该怎么做呢?我已经尝试返回视图控制器的恢复id,title和navigationitem.title来查找它是哪一个但是全部返回(null)。我在调用任何视图控制器之前以编程方式设置了恢复ID,因此它应该没问题,但在app delegate中访问时却不知道。
编辑: 流程如下: 应用程序第一次启动app委托方法didFinishLaunchingWithOptions检查是否存储了某些数据。如果是,则运行以下代码:
AACMainViewController *firstController = [storyBoard instantiateViewControllerWithIdentifier:@"aacmainViewController"];
firstController.restorationIdentifier = @"AACMainViewController";
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:firstController];
self.window.rootViewController = navController;
用户现在位于主菜单中。如果此时用户收缩应用程序然后恢复它,则最终会调用应用程序委托方法applicationDidBecomeActive。如果是,它运行另一种方法。我们感兴趣的代码是:
UIViewController * top = [self topViewController];
//[top viewDidAppear:YES];
NSString * toptitle = top.title;
NSString * resid = top.restorationIdentifier;
NSLog(@"App top res ID is %@",resid);
NSLog(@"App top title is %@",top title);
方法topViewController及其调用的方法是:
- (UIViewController *)topViewController
{
return [self topViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (UIViewController *)topViewController:(UIViewController *)rootViewController
{
NSLog(@"%@",@"topViewController: ---");
if (rootViewController.presentedViewController == nil)
{
NSLog(@"%@",@"presentedViewController == nil");
return rootViewController;
}
//isMemberOfClass: //isKindOfClass:
if ([rootViewController.presentedViewController isMemberOfClass:[UINavigationController class]])
{
NSLog(@"%@",@"isMemberOfClass");
UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController;
UIViewController *lastViewController = [[navigationController viewControllers] lastObject];
return [self topViewController:lastViewController];
}
NSLog(@"%@",@"End");
UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController;
return [self topViewController:presentedViewController];
}
目前,虽然在运行应用程序时主视图中显示了标题,但应用程序委托中的NSLog会认为它为空!
编辑2:
我发现如果你在缩小它之前手动设置viewDidLoad或viewDidAppear中的标题,那么它就知道恢复时的标题。由于标题已经显示在设备上,因此没有意义。它也存在问题。一旦你以这种方式在代码中设置标题(比如标题是“Test1”),除非你在代码中为新的视图控制器设置标题(比如说“Test2”),否则缩小和恢复哪个视图并不重要。 ,它仍然认为标题是最后一个(“Test1”)。我有很多视图控制器,所以手动设置它太乏味了。