2011-01-10 3 views
7

У меня есть UITabBarController с двумя вкладками, один из которых является простым UIViewController, а другой - UINavigationController, используя второй UIViewController в качестве его rootController (позже это будет использоваться для настройки UITableView). Мой вопрос заключается в том, чтобы называть вкладки (т. Е. Устанавливать заголовок каждого UITabBarItem)Настройка заголовка UITabBarItem из UINavigationController?

Для первой вкладки (простой UIViewController) я добавил следующее (см. Ниже) к методу -init контроллеров.

// FROM -[MapController init] 
- (id)init { 
    self = [super init]; 
    if(self) { 
     UITabBarItem *tabBarItem = [self tabBarItem]; 
     [tabBarItem setTitle:@"ONE"]; 
    } 
    return self; 
} 

Для другой вкладки я добавил (см. Ниже) ко второму контроллеру init (rootController).

// FROM -[TableController init] 
- (id)init { 
    self = [super init]; 
    if(self) { 
     UITabBarItem *tabBarItem = [[self navigationController] tabBarItem]; 
     [tabBarItem setTitle:@"TWO"]; 
    } 
    return self; 
} 

Am I установка второго титула tabBarItem в нужном месте, в настоящее время она не отображается, когда я запустить приложение на вкладке первой говорит «ONE» второй пустой. Также tabBarItem (выше) показывает nil, когда я печатаю значение или смотрю через отладчик.

EDIT_001: Добавлен полный код из AppDelegate

я могу правильно установить UITabBarItem внутри AppDelegate, когда я сначала создать контроллеры, готовые для добавления к UITabBarController. Но я действительно хотел сделать это в индивидуальном контроллере, используя методы для аккуратности.

// UITabBarController 
UITabBarController *tempRoot = [[UITabBarController alloc] init]; 
[self setRootController:tempRoot]; 
[tempRoot release]; 
NSMutableArray *tabBarControllers = [[NSMutableArray alloc] init]; 

// UIViewController ONE 
MapController *mapController = [[MapController alloc] init]; 
[tabBarControllers addObject:mapController]; 
[mapController release]; 

// UITableView TWO 
TableController *rootTableController = [[TableController alloc] init]; 
UINavigationController *tempNavController = [[UINavigationController alloc] initWithRootViewController:rootTableController]; 
[rootTableController release]; 
[tabBarControllers addObject:tempNavController]; 
[tempNavController release]; 

[rootController setViewControllers:tabBarControllers]; 
[tabBarControllers release]; 

[window addSubview:[rootController view]]; 
[window makeKeyAndVisible]; 

EDIT_002: Решение до сих пор, обновление UITabBarItems в приложение делегата, например,

// TABLE CONTROLLER 
TableController *tableController = [[TableController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableController]; 
[tableController release]; 
[tabBarControllers addObject:navController]; 
UITabBarItem *tabBarItem_002 = [navController tabBarItem]; 
[tabBarItem_002 setTitle:@"TWO"]; 
[tabBarItem_002 setImage:[UIImage imageNamed:@"GT_TWO.png"]]; 
[navController release]; 

EDIT_003: есть способ установить UITabBarItem в UINavigationController или делегат (как кажется) действительно лучшее место, чтобы сделать это.

ответ

10

Вам действительно нужно создать tabBarItem самостоятельно, а затем назначить его свойству tabBarItem контроллера вида. Попробуйте это в вашей инициативе:

UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"TWO" 
                 image:[UIImage imageNamed:@"GT_TWO.png"] 
                  tag:0]; 
self.tabBarItem = tabBarItem; 
[tabBarItem release]; 

Надеюсь, это поможет.

+1

self.navigationController.tabBarItem = tabBarItem - это то, что сработало для меня, если кто-то захочет попробовать другое решение! – Rabiees

0

Попробуйте это -

в заголовочном файле

@interface yournavController : UIViewController<UITabBarDelegate> 

и в методе инициализации

self.navigationController.tabBar.delegate=self; 
    [self.navigationController.tabBar setTitle:@"TWO"]; 

надеются, что это поможет

3

Хотя init'ing в tableviewcontroller, это пока не входит в состав навигационного контроллера. Вот почему переменная tabbaritem равна нулю.

Не уверен, что это работает, но вы можете настроить tabbaritem tableviewcontroller. С небольшим успехом наложенный навигационный контроллер наследует его. (то есть, как это работает с свойством title)

+0

Привет Крис, а это очень хороший момент, я не заметил этого. – fuzzygoat

2

Я принял подход создания вспомогательного метода для этого в AppDelegate для проекта, над которым я работал.Это помогло мне централизовать логику, которая устанавливает значки и заголовки для контроллеров представлений в контроллере панели вкладок и должна писать только один раз.

- (void)setIconAndTitleForViewController:(UIViewController *)viewController iconName:(NSString *)iconName titleKey:(NSString *)titleKey 
{ 
    NSString *iconPath = [[NSBundle mainBundle] pathForResource:iconName ofType:@"png"]; 
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:iconPath]; 
    viewController.tabBarItem.image = image; 
    [image release]; 
    viewController.title = NSLocalizedString(titleKey, @""); 
} 

Вы бы тогда называть его похожим на:

UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"SomeNibName" bundle:[NSBundle mainBundle]]; 
[self setIconAndTitleForViewController:viewController iconName:@"AnIcon" titleKey:@"SomeKey"]; 

Затем добавить контроллер представления в массив UIViewControllers на UITabBarController.

0

Как и Марко, вы должны создать объект, настроить его по своему желанию, а затем назначить его. На самом деле это в документации Apple.

0

У меня точно такая же проблема, и наш вопрос был принят, и принятый ответ весьма полезен. Тем не менее, я пришел к следующему решению:

  1. В пределах раскадровки (или IB удался панель вкладок) Я поставил титулы элемента панели вкладки не их названия, но в ключевой строку, которая используется во всех локализованном Файлы Localizable.strings. В моем случае это подходящий немецкий текст. Во многих других случаях это будет английский или даже уникальный ключ любой формы.
  2. Witin моего приложения delegat в didFinishLaunchingWithOptions я добавил:

for (UIViewController *vc in self.window.rootViewController.childViewController) { vc.tabBarItem.title = NSLocalizedString(vc.tabBarItem.title, @"Tab Bar Title"); }

На данный момент времени, панель вкладок полностью загружена, все (верхние) контроллеры ракурса полностью инициализированы, но только контроллер представления первой вкладки полностью загружена. Все, что в viewDidLoad, как вы пытались и как я пробовал сначала, не совсем полезно. Установка заголовков в методах init не помогает ни потому, что эти значения перезаписываются панелью рассказов. Теперь TabBarItems имеют ключи как заголовок, которые могут выглядеть не слишком профессиональными. Но преобразование их в локализованный эквивалент на данный момент делает трюк.

Смежные вопросы