iOS获取app委托中最顶层视图控制器的ID

时间:2015-01-21 02:27:29

标签: ios objective-c appdelegate

当我的应用程序恢复时,我会在我的一个应用委托方法中找到最顶层的视图控制器(应用程序处于活动状态时最后显示的内容)。我知道它有效,因为调用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”)。我有很多视图控制器,所以手动设置它太乏味了。

0 个答案:

没有答案