我是iOS App的新手。我使用的是默认表索引为2的选项卡。我的问题是:当按下通知(处于app的背景状态)单击通知后,我的应用程序打开选项卡2并显示一个警报视图。单击“警报视图”按钮后,我想将selectedTab更改为3。我在appDelegate中用appDelegate编写代码:clickedButtonAtIndex:,一切正常。
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的ViewWillAppear (例如vc1)。
(2)将vc2从vc1推送后,不调用viewWillAppear of VC2。
3)返回到VC1,ViewDidDisappear,ViewWillDisappear of VC2不被调用。
我找了很多东西,却找不到缺少的地方。请帮帮我。提前谢谢。
发布于 2016-12-05 08:28:16
假设UINavigationController是应用程序的rootViewController,并且您正在将TabBarController推到它的导航堆栈,这应该可以正常工作。
编辑
从您的注释中可以清楚地看到,您的导航堆栈中的选项卡条控制器位于位置1,而不是0 :),因此现在在索引1处查找viewController。
(self.window?.rootViewController as! UINavigationController).viewControllers[1] as! UITabBarController).selectedIndex = your_index_value建议:
虽然上述解决方案的优点是,制表符控制器位于索引1,但是如果您决定修改导航堆栈本身,选项卡条控制器在导航堆栈中的位置可能会在某一点上发生变化。
与其硬编码索引值,您可以做的是,在应用程序委托中有一个名为tab bar控制器的变量并将其公开:)现在,一旦您在将选项卡条控制器推送到导航堆栈之前创建了一个选项卡栏控制器,现在保存对它的引用:)
由于app委托是单例的,所有viewControllers都可以访问它的公共属性,所以现在可以使用app delegate.tabBarController :)直接访问它。)
现在,谁在乎它在哪里导航堆栈:)现在您有了对选项卡栏的引用,愉快地使用它:)快乐编码:)
发布于 2016-12-05 07:23:36
您不应该直接调用viewWillAppear,也不应该重新加载选项卡条控制器,因为您已经选择了选项卡编号2来加载它。
你所需要做的就是
[((UITabBarController*)self.window.rootViewController) setSelectedIndex:3];在警报处理程序中。
https://stackoverflow.com/questions/40968506
复制相似问题