如何从 AppDelegate 打开特定的 ViewController?

Posted

技术标签:

【中文标题】如何从 AppDelegate 打开特定的 ViewController?【英文标题】:How to open specific ViewController from AppDelegate? 【发布时间】:2015-11-03 13:29:49 【问题描述】:

我知道这个问题已经被问过很多次了。但我是一个新手,我无法找到任何解决方案来帮助我适应我的情况。以下是简要说明:

我有一个以 UITabBarController 作为 root 的应用程序。

在应用程序委托中,我检查用户是否已经登录。如果是,我将打开根控制器。

self.window.rootViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateInitialViewController];

我的应用程序运行良好。但现在我需要实现通知。当我在didFinishLaunchingWithOptions 中获得通知内容时:

NSDictionary *notificationPayload = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
NSString *messageType = [notificationPayload objectForKey:@"messageType"];

现在如果有消息:

if (messageType.length > 0 )

    //Here based on message I need to open different tabs of TabBarViewController

     UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
     //RootTabBarViewController *listingVC = [[RootTabBarViewController alloc] init];
     [(UINavigationController *)self.window.rootViewController pushViewController:tabBarController animated:YES];


上面的这段代码对我不起作用。 而且我不知道如何打开不同的选项卡并在这里为他们的徽章表格赋予价值。它总是使用这些代码导航到第一个索引选项卡。我看到其他答案说:

self.tabBarController.selectedIndex = 2;

但对我不起作用。我已经实现了一个 UITabBarController 类,我可以从那里为每个选项卡项徽章设置值,但我在 AppDelegate 中获得了我的 notificationPayLoad

【问题讨论】:

试试这个并根据你的情况修改***.com/questions/10015567/… 【参考方案1】:

正如您所说,您正在使用带有情节提要的 TabBarController。那你为什么要再次初始化?您可以按照以下方式进行操作

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    // Override point for customization after application launch.
    if([[NSUserDefaults standardUserDefaults]boolForKey:@"Selected"])
    
        [[NSUserDefaults standardUserDefaults]setBool:NO forKey:@"Selected"];
        UITabBarController *tabController = (UITabBarController*)self.window.rootViewController;
        tabController.selectedIndex=1;
    else
        [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"Selected"];
        UITabBarController *tabController = (UITabBarController*)self.window.rootViewController;
        tabController.selectedIndex=0;
    
    return YES;

这里我只是展示了一个演示代码,用于在 didFinishLaunching 中的不同 selectedIndex 访问 TabbarController。

【讨论】:

【参考方案2】:

假设您已经在情节提要中设计(拖放 UITabBar/UITabBarController)。

if (messageType.length > 0 )

    //Here based on message I need to open different tabs of TabBarViewController



    NSUInteger indexOfRequiredTab = 2;// pass the index of controller here

    id rootObject = self.window.rootViewController;
    if ([rootObject isKindOfClass:[UITabBarController class]]) 

        UITabBarController *tabBarControllerObject = (UITabBarController *)rootObject;

        if (indexOfRequiredTab != NSNotFound && indexOfRequiredTab < tabBarControllerObject.tabBar.items.count) 

            tabBarControllerObject.tabBar.items[indexOfRequiredTab].badgeValue = @"2"; //to set badge value

            tabBarControllerObject.selectedIndex = indexOfRequiredTab; //Setting this property changes the selected view controller to the one at the given index in the viewControllers array
        
    



故事板上设计的视图已经初始化,我们可以使用IBOutlet访问它们并更改它们的属性。

【讨论】:

以上是关于如何从 AppDelegate 打开特定的 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如果当前打开特定的 ViewController,如何检查 AppDelegate

如何将数据从 appdelegate 传递到视图控制器?

如何从 Appdelegate 打开 Viewcontroller?

从 AppDelegate 调用 navigationController

如何从appdelegate打开弹出窗口?

从 AppDelegate 呈现特定的视图控制器