单击推送通知警报后未调用 ViewWillAppear

ViewWillAppear not called after clicking on alert of pushnotificatioin

我是 iOS 应用开发的新手。我正在开发具有默认 tabindex 为 2 的 tabbar 的应用程序。 我的问题是:当点击通知后推送通知到达(在应用程序的后台状态)时,我的应用程序在选项卡 2 上打开并显示警报视图。单击 alertview 按钮后,我想将 selectedTab 更改为 3。我在 alertView:clickedButtonAtIndex: 的 appDelegate 中编写以下代码,一切正常。

    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"story_iphone" bundle:nil];
    TabBarController * tb = [sb instantiateViewControllerWithIdentifier:@"TabBarController"];
    [[tb.viewControllers  firstObject] viewWillAppear:YES];
    [tb viewWillAppear:YES];
    [tb setSelectedIndex:3];
    self.window.rootViewController = tb;

但我面临以下问题:

1) VC(比如 vc1)的 ViewWillAppear 未被调用。

2)同样在从 vc1 推送 vc2 后,VC2 的 viewWillAppear 不会被调用。

3) 弹回VC1,不调用VC2的ViewDidDisappear、ViewWillDisappear。

我已经搜索了很多,但我找不到我缺少的地方。 请帮我。提前致谢。

您不应该直接调用 viewWillAppear,或重新加载标签栏控制器,因为您已经加载了它并选择了标签编号 2。

你需要做的就是

[((UITabBarController*)self.window.rootViewController) setSelectedIndex:3];

在警报处理程序中。

假设 UINavigationController 是您应用的 rootViewController,并且您将 TabBarController 推送到它的导航堆栈,这应该可以正常工作

编辑

从您的评论中可以清楚地看出,您的导航堆栈中的选项卡栏控制器位于位置 1 而不是 0 :) 因此现在在索引 1 处查找 viewController。

(self.window?.rootViewController as! UINavigationController).viewControllers[1] as! UITabBarController).selectedIndex = your_index_value

建议:

虽然上述解决方案的工作原理是,标签栏控制器位于索引 1,但如果您决定修改导航堆栈本身,标签栏控制器在导航堆栈中的位置可能会在某些时候发生变化。

而不是对索引值进行硬编码,您可以做的是,在您的应用委托中有一个名为标签栏控制器的变量并将其设为 public :) 现在,一旦您在推送之前创建了一个标签栏控制器它到导航堆栈现在持有对它的引用 :)

因为 app delegate 是单例的,而且它的 public 属性 可以被所有 viewController 访问,现在你可以直接使用 app delegate.tabBarController 访问它了:)

现在谁在乎导航堆栈在哪里 :) 现在你有了对标签栏的引用 愉快地使用它 :) 快乐编码 :)