xcode 使用 StoryBoards 以编程方式设置 UITabBarItem 图标?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8761468/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Programmatically setting UITabBarItem icons with StoryBoards?
提问by Will Larche
I want to use a UITabBarSystemItem for the icon of one of my tabBarItem's but I'm using storyboards. I'm not sure where to set it. If I set it in the view's viewDidLoad then it doesn't change until you push the button in the tabBar. Before that it's just the blue ? square.
我想使用 UITabBarSystemItem 作为我的 tabBarItem 之一的图标,但我使用的是故事板。我不确定在哪里设置它。如果我在视图的 viewDidLoad 中设置它,那么它不会改变,直到你按下 tabBar 中的按钮。在此之前,它只是蓝色?正方形。
And as far as I know, you can't use UITabBarSystemItems in IB inspector.
据我所知,您不能在 IB 检查器中使用 UITabBarSystemItems。
UPDATE:
更新:
Well first of all I'm an idiot. You can totally choose the icon in the IB Inspector.
好吧,首先我是个白痴。您完全可以在 IB Inspector 中选择图标。
Tab Bar Item -> Identifier -> Choose your icon.
标签栏项目 -> 标识符 -> 选择你的图标。
But the question still remains how to do it programmatically. Or rather when/where?
但问题仍然是如何以编程方式做到这一点。或者更确切地说是何时/何地?
回答by John F
When using storyboards, a view controller initializes using the initWithCoder constructor so you could override that function and set the system item icon there like so
使用故事板时,视图控制器使用 initWithCoder 构造函数进行初始化,因此您可以覆盖该函数并像这样设置系统项图标
- (id)initWithCoder:(NSCoder*)aDecoder
{
if(self = [super initWithCoder:aDecoder])
{
self.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:1];
}
return self;
}
Naturally, you can change the value of the system item to any of the values supported. Apple lists them here
当然,您可以将系统项的值更改为支持的任何值。苹果在这里列出了它们
回答by iCreative
Check this code for your problem: Its working in my app.
检查此代码是否存在您的问题:它在我的应用程序中工作。
- (NSArray *) initializeViewControllers
{
NSArray *viewControllerArray = nil;
viewController1 = <View Init Code>
viewController2 = <View Init Code>
viewController3 = <View Init Code>
1stNavController = [[UINavigationController alloc] initWithRootViewController:viewController1];
UIImage *img = [UIImage imageNamed:@"tab_home"];
[1stNavController .tabBarItem initWithTitle:@"Home" image:img tag:1];
2ndNavController = [[UINavigationController alloc] initWithRootViewController:viewController2];
img = [UIImage imageNamed:@"tab_timeDrop"];
[2ndNavController .tabBarItem initWithTitle:@"Time Entry" image:img tag:2];
3rdNavController = [[UINavigationController alloc] initWithRootViewController:viewController3];
img = [UIImage imageNamed:@"tab_invoiceSummary"];
[3rdNavController.tabBarItem initWithTitle:@"Invoice Summary" image:img tag:3];
viewControllerArray = [NSArray arrayWithObjects:1stNavController,2ndEntryNavController,3rdReportNavController, nil];
return viewControllerArray;
}
This code is returning View Controllers with Images for their respective tabs. Here i used Navigation Controller inside the tabbar controller. you can also use view controller instead of navigation Controller.
此代码为各自的选项卡返回带有图像的视图控制器。在这里,我在标签栏控制器中使用了导航控制器。您还可以使用视图控制器代替导航控制器。
Just add this code and initialize your tabbar controller as follows inside appdidfinishlaunching
method:
只需添加此代码并在appdidfinishlaunching
方法中按如下方式初始化您的标签栏控制器:
tabbarController = [[UITabBarController alloc] init];
_tabbarController.viewControllers = [self initializeViewControllers];
self.window.rootViewController = tabbarController;
Hope it works.
希望它有效。
Please reply.
请回复。
回答by s.muellner
Well that's quite simple!
嗯,这很简单!
For the where -> create a custom TabBarController (e.g. WBTabBarController). In your StoryBoard explicitly set it.
对于 where -> 创建自定义 TabBarController(例如 WBTabBarController)。在您的 StoryBoard 中明确设置它。
For the how -> just overwrite viewDidLoad of the WBTabBarController and set your images for the TabBarItems. In the following example this was done using the NIKFontAwesomeIconFactory:
对于如何 -> 只需覆盖 WBTabBarController 的 viewDidLoad 并为 TabBarItems 设置图像。在以下示例中,这是使用 NIKFontAwesomeIconFactory 完成的:
#import "WBTabBarController.h"
#import "NIKFontAwesomeIcon.h"
#import "NIKFontAwesomeIconFactory.h"
#import "NIKFontAwesomeIconFactory+iOS.h"
@interface WBTabBarController ()
@end
@implementation WBTabBarController
- (void)viewDidLoad
{
[super viewDidLoad];
NIKFontAwesomeIconFactory *factory = [NIKFontAwesomeIconFactory tabBarItemIconFactory];
UITabBarItem *item0 = self.tabBar.items[0];
item0.image = [factory createImageForIcon:NIKFontAwesomeIconApple];
UITabBarItem *item1 = self.tabBar.items[1];
item1.image = [factory createImageForIcon:NIKFontAwesomeIconStackOverflow];
}
@end
回答by jrturton
Assuming the initial scene of your storyboard is the tab bar view controller, you can access it in applicationDidFinishLaunching, it is the rootViewController
of the app delegate's window
. I don't know if you can swap in a system item if the bar item is already present, but you can definitely set the image and title.
假设故事板的初始场景是标签栏视图控制器,您可以在 applicationDidFinishLaunching 中访问它,它是rootViewController
应用程序委托的window
. 如果栏项目已经存在,我不知道您是否可以交换系统项目,但您绝对可以设置图像和标题。