2011-01-10 21 views
7

He configurado un UITabBarController con dos pestañas, uno es un UIViewController simple y el otro es un UINavigationController que usa un segundo UIViewController como su controlador raíz (esto se usará más adelante para configurar un UITableView). Mi pregunta es con respecto a nombrar las pestañas (es decir, establecer el título de cada UITabBarItem)Establecer el título UITabBarItem desde UINavigationController?

Para la primera pestaña (UIViewController simple) he agregado lo siguiente (ver a continuación) a los controladores -init método.

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

Para la otra pestaña que he agregado (ver a continuación) a la segunda controladores init (rootController).

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

¿Estoy estableciendo el segundo título tabBarItem en el lugar correcto en la actualidad no está mostrando, cuando corro la aplicación de la primera pestaña dice "UNO", el segundo está en blanco. También tabBarItem (arriba) muestra nulo cuando imprimo el valor o miro a través del depurador.

EDIT_001: Añadido código completo de AppDelegate

que puede ajustar correctamente el UITabBarItem desde dentro de la AppDelegate cuando por primera vez crear los controladores, listos para añadir a la UITabBarController. Pero realmente quería hacer esto en el controlador individual, en sus métodos de pulcritud.

// 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: Solución hasta ahora, Actualizar UITabBarItems en delegado de la aplicación, por ejemplo,

// 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: es que hay una manera de establecer la UITabBarItem en el UINavigationController o es el delegado (como parece) realmente el mejor lugar para hacerlo.

Respuesta

10

De hecho, usted tiene que crear el tabBarItem usted mismo y luego asignarlo a la propiedad del tabBarItem del controlador de la vista. Pruebe esto en su init:

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

Espero que esto ayude.

+1

self.navigationController.tabBarItem = tabBarItem es lo que funcionó para mí en caso de que alguien quiera probar una solución diferente. – Rabiees

0

Prueba esto -

en el archivo de cabecera

@interface yournavController : UIViewController<UITabBarDelegate> 

y en el método init

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

esperan que ayude a

3

Mientras init'ing la tableviewcontroller, se no es parte del controlador de navegación todavía. Es por eso que la variable tabbaritem es nula.

No estoy seguro de si esto funciona, pero puede configurar el tabbaritem del tableviewcontroller. Con un poco de suerte, el controlador de navegación adjunto lo heredará. (Así es cómo funciona con la propiedad del título)

+0

Hola Kris, ah, eso es un muy buen punto, no lo había visto. – fuzzygoat

2

Tomé el enfoque de crear un método de ayuda para hacer esto en el AppDelegate para un proyecto en el que he estado trabajando.Me ayudó a centralizar la lógica que configura los iconos y títulos para los controladores de vista en el controlador de la barra de pestañas y solo tiene que escribirlo una vez.

- (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, @""); 
} 

A continuación, llamarlo similar a:

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

continuación, agregue el controlador de vista de la variedad de UIViewControllers en la UITabBarController.

0

Al igual que dijo Marco, tiene que instanciar el elemento, configurarlo a su voluntad, luego asignarlo. De hecho, está en la documentación de Apple :)

0

Tengo exactamente el mismo problema y encuentro su pregunta y la respuesta aceptada bastante útil. Sin embargo, llegué a la siguiente solución:

  1. Dentro del guión gráfico (o IB conseguido cuenta del bar) he puesto títulos del elemento barra de pestañas no a su título, pero a la cadena de clave que se utiliza en todo el localizada Archivos "Localizable.strings". En mi caso, este es el texto alemán correspondiente. En muchos otros casos, este será el inglés o incluso alguna clave única de cualquier forma.
  2. witin mi aplicación delegat en didFinishLaunchingWithOptions I añadido:

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

En este punto en el tiempo, la barra de pestañas está completamente cargado, todos (superior) controladores de vista están completamente inicializan pero sólo el controlador de vista de la primera pestaña está completamente cargada. Cualquier cosa en viewDidLoad, como lo intentaste y como lo intenté primero, no es de mucha ayuda. Establecer los títulos en los métodos init tampoco es útil porque el tablero de la historia sobrescribe esos valores. Ahora los TabBarItems tienen las claves como título que pueden no parecer muy profesionales. Pero convertirlos al equivalente localizado en este momento hace el truco.

Cuestiones relacionadas