用StoryBoards以编程方式设置UITabBarItem图标?

时间:2012-01-06 16:59:53

标签: iphone xcode ios5

我想使用UITabBarSystemItem作为我的一个tabBarItem的图标,但我正在使用故事板。我不确定在哪里设置它。如果我在视图的viewDidLoad中设置它,那么在按TabBar中的按钮之前它不会改变。在那之前它只是蓝色?广场。

据我所知,你不能在IB检查员中使用UITabBarSystemItems。

更新

首先,我是个白痴。您可以在IB Inspector中完全选择图标。

标签栏项目 - >标识符 - >选择你的图标。

但问题仍然是如何以编程方式进行。或者更确切地说何时/何地?

4 个答案:

答案 0 :(得分:11)

使用故事板时,视图控制器使用initWithCoder构造函数初始化,因此您可以覆盖该函数并在其中设置系统项图标

- (id)initWithCoder:(NSCoder*)aDecoder 
{
    if(self = [super initWithCoder:aDecoder]) 
    {
        self.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:1];
    }
    return self;
}

当然,您可以将系统项的值更改为支持的任何值。 Apple列出了here

答案 1 :(得分:7)

检查此代码是否存在问题:它在我的应用中运行。

- (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;
}

此代码返回带有图像的视图控制器,用于各自的选项卡。这里我在tabbar控制器中使用了Navigation Controller。您也可以使用视图控制器而不是导航控制器。

只需添加此代码并在appdidfinishlaunching方法

中按如下方式初始化tabbar控制器
 tabbarController = [[UITabBarController alloc] init];

_tabbarController.viewControllers = [self initializeViewControllers];

self.window.rootViewController = tabbarController;

希望它有效。

请回复。

答案 2 :(得分:3)

那很简单!

对于where - &gt;创建一个自定义TabBarController(例如WBTabBarController)。 在你的StoryBoard中明确设置它。

如何 - &gt;只需覆盖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

答案 3 :(得分:2)

假设您的情节提要的初始场景是标签栏视图控制器,您可以在applicationDidFinishLaunching中访问它,它是应用委托rootViewController的{​​{1}}。如果条形项已经存在,我不知道你是否可以交换系统项,但你绝对可以设置图像和标题。