与Push交互后导航到特定的ViewController

时间:2015-08-20 03:29:03

标签: ios objective-c swift uinavigationcontroller apple-push-notifications

当用户通过与推送通知交互进入iOS应用程序时,我很难找到关于管理导航流的最佳方式的任何好信息。

在我的例子中,我有一个UITabController,其中每个选项卡都有一个根UINavigationController。例如,让我们说推送应该引导我进入第二个标签。稍微复杂一点,取决于push的json,我可能想从根开始,或者我可能想要填充一堆viewControllers,其中最后一个以特定方式初始化,因为json中的变量

问题可以在概念上进行重新构建:当用户通过PushNotification激活应用程序时,填充NavigationController堆栈并显示n-1 ViewController的正确方法是什么(均来自终止和背景状态)。使用哪种委托方法,以及如何避免竞争条件,因为它可能的ViewController将被取消初始化。

由于

2 个答案:

答案 0 :(得分:0)

  

AppDelegate.h

在AppDelegate.h文件中创建一个UITabBarController对象

@property (nonatomic, strong) UITabBarController *tabBarController;
  

AppDelegate.m

定义处理远程推送通知的方法

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
        CustomViewController1 *view1 = [[CustomViewController1 alloc] initWithNibName:@"CustomViewController1" bundle:nil];
        UINavigationController *view1 = [[UINavigationController alloc] initWithRootViewController:view1];

        CustomViewController2 *view2 = [[CustomViewController2 alloc] initWithNibName:@"CustomViewController2" bundle:nil];
        UINavigationController *view2 = [[UINavigationController alloc] initWithRootViewController:view2];

        CustomViewController3 *view3 = [[CustomViewController3 alloc]initWithNibName:@"CustomViewController3" bundle:nil];
        UINavigationController *view3 = [[UINavigationController alloc] initWithRootViewController:view3];

        NSArray *arrNavControllers = [NSArray arrayWithObjects:view2, view2, view2, nil];

        // Set here CustomViewController On Which you want to Naviagte
        [self.tabBarController setSelectedIndex:0];
        [self.window setRootViewController:self.tabBarController];
    }

答案 1 :(得分:0)

UINavigationController类有一个属性viewControllers,它是UIViewController的数组,其中数组的最后一个成员是导航控制器堆栈顶部的成员。所以步骤如下:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    let tabController = UITabBarController(nibName: nil, bundle: nil)
    let navCon1 = UINavigationController(nibName: nil, bundle: nil)
    let navCon2 = UINavigationController(nibName: nil, bundle: nil)
    let viewCon1 = UIViewController(nibName: nil, bundle: nil)
    let viewCon2 = UIViewController(nibName: nil, bundle: nil)
    navCon2.setViewControllers([viewCon1, viewCon2], animated: false)

    tabController.setViewControllers([navCon1, navCon2], animated: false)
    tabController.selectedIndex = 1

    window?.rootViewController = tabController

}

实例化UITabBarController,实例化UINavigationController并设置其2个视图控制器(记住数组中的最后一个位于堆栈顶部)没有动画,然后将导航控制器添加到{{ 1}}。

这只是一个展示,但是控制器也可以从故事板中使用UITabBarController UIStoryboard