与 Push 交互后导航到特定 ViewController

Posted

技术标签:

【中文标题】与 Push 交互后导航到特定 ViewController【英文标题】:Navigation to Specific ViewController After Interacting With Push 【发布时间】:2015-08-20 03:29:02 【问题描述】:

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

就我而言,我有一个 UITabController,其中每个选项卡都有一个根 UINavigationController。例如,假设推送应该将我带到第二个选项卡。让事情复杂一点,取决于推送的 json,我可能想从根开始,或者我可能想填充一个 viewControllers 堆栈,由于 json 中的变量,最后一个以特定方式初始化。

这个问题可以从概念上重新定义:当用户通过 PushNotification(从终止状态和背景状态)激活应用程序时,填充 NavigationController 的堆栈并显示 n-1 ViewController 的正确方法是什么。使用哪些委托方法,以及如何避免竞争条件,因为 ViewController 很可能未初始化。

谢谢

【问题讨论】:

【参考方案1】:

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];
    

【讨论】:

【参考方案2】:

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

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 个视图控制器(记住数组中的最后一个在堆栈顶部)而不使用动画,然后将导航控制器添加到 UITabBarController

这只是一个展示,但控制器也可以从情节提要中使用UIStoryboard's instantiateViewControllerWithIdentifier(_:)

【讨论】:

以上是关于与 Push 交互后导航到特定 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

iOS 设置导航栏透明后 push 界面 界面下移64高度

Redux&React路由器:梳理调度和导航(history.push)

执行 push segue 后,当给搜索栏焦点时,导航栏隐藏

在 iOS 10 下使用 FCM 在前台单击推送通知后无法导航到特定的 viewController

付款成功后我想导航到另一个页面

jsp页面数据与action数据交互 使用导航图语言和set注入