使用不是 rootViewController 的 TabBarViewController 更改 UITabBar 的图标

Posted

技术标签:

【中文标题】使用不是 rootViewController 的 TabBarViewController 更改 UITabBar 的图标【英文标题】:Change the icons of the UITabBar with a TabBarViewController which is not the rootViewController 【发布时间】:2014-11-25 17:37:57 【问题描述】:

我想更改我的 UITabBar 的图标。是的,*** 上有几个主题,我阅读了大量主题,但没有找到答案。

我的第一个视图控制器是登录视图控制器,并且 我的第二个 VC 是 TabBarViewController。我在 StoryBoard 中将 TheTabBar 命名为 TabBarViewController。

这是我的代码,但它不起作用,我不知道为什么:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UITabBarController* tabBarController = (UITabBarController*)[storyboard instantiateViewControllerWithIdentifier:@"TheTabBar"];

NSLog(@"STORY = %@",storyboard);
NSLog(@"TABBAR = %@",tabBarController);

UITabBar *tabBar = tabBarController.tabBar;
UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];
UITabBarItem *tabBarItem3 = [tabBar.items objectAtIndex:2];
UITabBarItem *tabBarItem4 = [tabBar.items objectAtIndex:3];
UITabBarItem *tabBarItem5 = [tabBar.items objectAtIndex:4];

tabBarItem1.selectedImage = [[UIImage imageNamed:@"firstselected.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem1.image = [[UIImage imageNamed:@"firstnonselected.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem1.title = @"First";

tabBarItem2.selectedImage = [[UIImage imageNamed:@"secondselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem2.image = [[UIImage imageNamed:@"secondnonselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem2.title = @"Second";

tabBarItem3.selectedImage = [[UIImage imageNamed:@"thirdselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem3.image = [[UIImage imageNamed:@"thirdnonselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem3.title = @"Third";

tabBarItem4.selectedImage = [[UIImage imageNamed:@"fourselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem4.image = [[UIImage imageNamed:@"fournonselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem4.title = @"Four";

tabBarItem5.selectedImage = [[UIImage imageNamed:@"fiveselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem5.image = [[UIImage imageNamed:@"fivenonselected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
tabBarItem5.title = @"Five";

谢谢大家!

【问题讨论】:

请您补充更多信息:上面的代码来自哪个类/方法?如何从登录视图控制器中显示 tabBarViewController? 嗨!谢谢你的帮助。我正在尝试不同的解决方案,当您撰写评论时,我刚刚在***.com/questions/19426251/… 找到了解决方案。谢谢 【参考方案1】:

如果您使用 StoryBoard,您可以使用“用户定义的运行时属性”来更改 UITabBarItem 的选定图像。

看起来像这样:

Attributes Inspector 中的“selected image” Attributes 不起作用,这是 Xcode 的 bug。

您可以使用 Image Set 来设置图像的 RenderingMode(Render As):

【讨论】:

关于资产目录的那一点对我有用(将 Render As 设置为 Original Image)。 渲染为原始图像解决了这个问题.....Mornich 你真是个天才......谢谢!!!我花了很多时间试图解决这个问题.....【参考方案2】:

您可以在应用程序的AppDelegate 文件中声明UITabBar。然后将控制器中的标签栏分配给 AppDelegate 的标签栏对象。然后,您可以使用任何控制器的应用程序委托的标签栏对象更改标签栏的图标。

【讨论】:

以上是关于使用不是 rootViewController 的 TabBarViewController 更改 UITabBar 的图标的主要内容,如果未能解决你的问题,请参考以下文章

当 rootViewController 不是 UINavigationController 时推送视图

window.rootViewController 怎么可能不是 initialViewController?

如何弹回rootViewController +1?

你能设置 RootViewController 的动画吗?

如果 UITabbarcontroller 不是 rootviewcontroller,如何从 Appdelegate 为 UIBarButtonItem 设置徽章(无论何时推送通知)?

当 UITabBar 不是 rootViewController 时,如何以编程方式将 UITabBar 与具有 NIB 的不同 ViewController 链接