2011-01-10 13 views
7

Ich habe einen UITabBarController mit zwei Registerkarten eingerichtet, einer ist ein einfacher UIViewController und der andere ist ein UINavigationController, der einen zweiten UIViewController als rootController verwendet (dies wird später zur Einrichtung eines UITableView verwendet). Meine Frage ist im Hinblick auf die Benennung der Registerkarten (d. H. Einstellung der Titel der einzelnen UITabBarItem)Einstellung UITabBarItem Titel von UINavigationController?

Für die erste Registerkarte (einfache UIViewController) Ich habe folgende hinzugefügt (siehe unten) zu den Controllern -init-Methode.

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

Für die andere Registerkarte habe ich hinzugefügt (siehe unten) zu den zweiten Controllern init (rootController).

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

Bin ich die zweite tabBarItem Titel in der richtigen Stelle Einstellung, wie sie derzeit ist es nicht angezeigt wird, wenn ich die Anwendung der erste Reiter laufen, sagt „ONE“, die zweite leer ist. Auch TabBarItem (oben) zeigt Null, wenn ich den Wert drucke oder über den Debugger suche.

EDIT_001: Hinzugefügt vollständige Code von AppDelegate

Ich kann richtig die UITabBarItem gesetzt innerhalb der AppDelegate, wenn ich die Controller zunächst erstellen, bereit für die zum UITabBarController hinzufügen. Aber ich wollte das wirklich in den einzelnen Controller -init-Methoden zur Ordentlichkeit machen.

// 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: Lösung so weit, beispielsweise Update-UITabBarItems in AppDelegate

// 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: ist es eine Möglichkeit, die UITabBarItem in der UINavigationController zu setzen oder ist der Delegierte der beste Ort, es zu tun (wie es scheint) wirklich.

Antwort

10

Sie müssen das tabBarItem tatsächlich selbst erstellen und dann der tabBarItem-Eigenschaft des View-Controllers zuweisen. Versuchen Sie dies in Ihrem init:

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

Ich hoffe, dies hilft.

+1

self.navigationController.tabBarItem = tabBarItem ist was für mich funktionierte, falls jemand eine andere Lösung ausprobieren möchte! – Rabiees

0

Try this -

in der Header-Datei

@interface yournavController : UIViewController<UITabBarDelegate> 

und in der Init-Methode

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

es hoffen

3

helfen Während die Tableviewcontroller init'ing, es ist noch nicht Teil des Navigationscontrollers. Deshalb ist die Variable tabbaritem gleich Null.

Nicht sicher, ob das funktioniert, aber Sie können das tabbaritem des Tableviewcontrollers konfigurieren. Mit ein wenig Glück erbt der einschließende Navigationscontroller es. (so funktioniert es mit der title-Eigenschaft)

+0

Hallo Kris, das ist ein sehr guter Punkt, ich hatte das nicht bemerkt. – fuzzygoat

2

Ich nahm den Ansatz der Erstellung einer Hilfsmethode, um dies in der AppDelegate für ein Projekt, an dem ich gearbeitet habe, zu tun.Es hat mir geholfen, die Logik zu zentralisieren, die die Icons und Titel für die View-Controller auf dem Tab-Bar-Controller einrichtet und nur einmal schreiben muss.

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

Sie würden es dann rufen ähnlich wie:

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

Dann mit dem Array von UIViewControllers auf der UITabBarController die View-Controller hinzuzufügen.

0

Genau wie Marco sagte, müssen Sie den Artikel instanziieren, konfigurieren Sie es nach Ihrem Willen, und dann zuweisen. Eigentlich ist es in Apple-Dokumentation :)

0

Ich habe genau das gleiche Problem und fand Ihre Frage eine akzeptierte Antwort sehr hilfreich. Aber ich kam zu folgenden Lösung:

  1. Im Storyboard (oder IB verwalteten Tab-Leiste) ich den Tab-Leiste Elements Titel habe nicht auf den Titel, sondern auf die Schlüsselzeichenfolge, die in alle der lokalisierten verwendet wird "Localizable.strings" Dateien. In meinem Fall ist dies der übereinstimmende deutsche Text. In vielen anderen Fällen wird dies der englische oder sogar irgendein einzigartiger Schlüssel irgendeiner Form sein.
  2. witin meine app delegat in didFinishLaunchingWithOptions ich hinzugefügt:

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

Zu diesem Zeitpunkt wird die Tab-Leiste voll beladen ist, werden alle (oberste) View-Controller vollständig initialisiert werden, sondern nur die View-Controller der ersten Registerkarte ist voll geladen. Alles in viewDidLoad, wie du es versucht hast und wie ich es zuerst versucht habe, ist nicht sehr hilfreich. Das Festlegen der Titel in den init-Methoden ist nicht hilfreich, da diese Werte vom Storyboard überschrieben werden. Jetzt haben die TabBarItems die Schlüssel als Titel, die möglicherweise nicht zu professionell aussehen. Aber das Konvertieren in das lokalisierte Äquivalent zu diesem Zeitpunkt macht den Trick.

Verwandte Themen