2011-01-10 18 views
7

İki sekmeli bir UITabBarController kurdum, biri basit bir UIViewController ve diğeri ise bir UINavigationController rootUntroller olarak ikinci UIViewController kullanıyor (bu daha sonra bir UITableView kurmak için kullanılacaktır). Sorum şu: sekmeleri adlandırma konusunda (yani, her UITabBarItem'in başlığını belirleme)UINavigationController'dan UITabBarItem başlığı ayarlama?

İlk sekme için (basit UIViewController) Aşağıdakileri (aşağıya bakın) denetleyicileri -init yöntemine ekledim.

Diğer sekmede, ikinci denetleyicileri init (rootController) öğesine ekledim (aşağıya bakın).

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

Ben ilk sekme "TEK" ikinci boştur diyor uygulamayı çalıştırdığınızda olarak şu anda bu gösterilmiyor doğru yerde ikinci tabBarItem başlık atanması muyum. Ayrıca tabBarItem (yukarıda) değeri yazdığımda veya hata ayıklayıcısından baktığımda sıfır gösterir.

EDIT_001: Ben ilk UITabBarController ekleyerek hazır denetleyicileri, oluştururken AppDelegate

den eklendi tam kod Doğru AppDelegate içinden UITabBarItem ayarlayabilirsiniz. Ama bunu gerçekten tek tek denetleyicide yapmak istedim.

// 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: Çözüm şimdiye kadar, uygulama temsilci Güncelleme UITabBarItems örn

// 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: UINavigationController içinde UITabBarItem ayarlamak için bir yol yoktur ya da (göründüğü gibi) temsilci bunu yapmak için gerçekten iyi yerdir.

cevap

10

Aslında tabBarItem'i kendiniz oluşturmanız ve ardından denetleyicinin tabBarItem özelliğine atamanız gerekir. Bunu initinizde deneyin:

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

Bu yardımcı olur umarım.

+1

self.navigationController.tabBarItem = tabBarItem, başka bir çözüm denemek isteyenlerin benim için çalıştığı şeydir! – Rabiees

0

bu deneyin -

başlık dosyasına

@interface yournavController : UIViewController<UITabBarDelegate> 

ve

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

tableviewcontroller init'ing iken

3

yardımcı olacağını umuyoruz init yönteminde, bu henüz navigasyon denetleyicisinin bir parçası değil. Bu nedenle tabbaritem değişkeni sıfırdır.

Bunun işe yarayıp yaramadığından emin olun, ancak tableviewcontroller'ın tabbaritemini yapılandırabilirsiniz. Biraz şansla, kapalı navigasyon kontrolcüsü onu devralır. (başlık özelliği ile nasıl çalışır?)

+0

Merhaba Kris, ah çok güzel bir nokta, bunu fark etmemiştim. – fuzzygoat

2

Üzerinde çalıştığım bir proje için AppDelegate'de bunu yapmak için bir yardımcı yöntem oluşturma yaklaşımı aldım.Sekme çubuğu denetleyicisindeki görünüm denetleyicileri için simgeler ve başlıklar oluşturan mantığı merkezileştirmeme yardımcı oldu ve yalnızca bir kez yazmak zorunda kaldım.

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

Sonra o benzer çağırır:

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

Sonra UITabBarController üzerinde UIViewControllers diziye görünüm denetleyicisi ekleyin.

0

Tıpkı Marco'nun dediği gibi, öğeyi anlamak, onu kendi isteğinize göre yapılandırmak ve sonra atamak zorundasınız. Aslında Apple belgelerinde var :)

0

Tam olarak aynı sorun var ve kabul edilen bir cevabı oldukça yararlı buldum. Onların başlığa ama lokalize tamamında kullanılan anahtar dizeye değil sekme çubuğu öğesinin başlıkları belirledik

  1. storyboard içinde (veya IB sekme çubuğunu yönetilen): Ancak, aşağıdaki çözüm geldi "Localizable.strings" dosyaları. Benim durumumda bu cevap veren Alman metnidir. Diğer birçok durumda bu, herhangi bir formun ingilizce veya hatta bazı benzersiz anahtarı olacaktır. didFinishLaunchingWithOptions benim app delegat witin
  2. ekledim:

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

sürede bu noktada, sekme çubuğu, bütün (üstteki) görünüm denetleyicileri tam olarak başlatılmış ancak yalnızca görünüm denetleyicisi olan tamamen yüklendikten İlk sekmenin tamamen dolu. Denediğiniz gibi ve ilk denediğim gibi, viewDidLoad'daki her şey oldukça yardımcı olmaz. Başlıkların init yöntemlerinde ayarlanması, ya bu öykülerin hikaye panosunun üzerine yazılmasından dolayı yararlı değildir. Artık TabBarItems'in anahtarları çok profesyonel görünmeyebilecek bir başlık var. Ancak bu noktada zaman içinde yerelleştirilmiş eşdeğerlere çevirmek hile yapar.

İlgili konular