Программная настройка значков UITabBarItem с помощью StoryBoards? - PullRequest
4 голосов
/ 06 января 2012

Я хочу использовать UITabBarSystemItem для иконки одного из моих tabBarItem, но я использую раскадровки. Я не уверен, где это установить. Если я установлю его в viewDidLoad, то он не изменится, пока вы не нажмете кнопку на панели вкладок. До этого это просто синий? площадь.

И, насколько я знаю, вы не можете использовать UITabBarSystemItems в Инспекторе IB.

UPDATE:

Ну, во-первых, я идиот. Вы можете полностью выбрать значок в Инспекторе IB.

Элемент панели вкладок -> Идентификатор -> Выберите значок.

Но все еще остается вопрос, как это сделать программно. А точнее когда / где?

Ответы [ 4 ]

11 голосов
/ 24 сентября 2012

При использовании раскадровок контроллер представления инициализируется с помощью конструктора initWithCoder, чтобы вы могли переопределить эту функцию и установить там значок системного элемента, например

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

Естественно, вы можете изменить значение системного элемента на любое из поддерживаемых значений. Apple перечисляет их здесь

7 голосов
/ 06 января 2012

Проверьте этот код для вашей проблемы: он работает в моем приложении.

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

Этот код возвращает View Controllers с изображениями для соответствующих вкладок.Здесь я использовал контроллер навигации внутри контроллера вкладок.Вы также можете использовать контроллер представления вместо контроллера навигации.

Просто добавьте этот код и инициализируйте свой контроллер панели вкладок следующим образом в методе appdidfinishlaunching:

 tabbarController = [[UITabBarController alloc] init];

_tabbarController.viewControllers = [self initializeViewControllers];

self.window.rootViewController = tabbarController;

Надеюсь, он работает.

Пожалуйста, ответьте.

3 голосов
/ 20 февраля 2014

Ну, это довольно просто!

Для where -> создайте пользовательский TabBarController (например, WBTabBarController). В вашей StoryBoard явно установите его.

Для того, как -> просто перезаписать viewDidLoad WBTabBarController и установить ваши изображения для 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
2 голосов
/ 06 января 2012

Если исходной сценой вашей раскадровки является контроллер представления панели вкладок, вы можете получить к нему доступ через applicationDidFinishLaunching, это rootViewController делегата приложения window.Я не знаю, можно ли заменить системный элемент, если элемент панели уже присутствует, но вы определенно можете установить изображение и заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...