2010-12-11 15 views
11

Ta aplikacja, którą piszę, ma problem.UITabBarItems w programie UITabBar pokaż po kliknięciu elementu, gdy aplikacja uruchamia się

Konfiguruję UITabBar w moim oknie aplikacji i ustaw ikony w plikach widoku. Ale kiedy uruchamiam aplikację, pojawiają się pierwsze ikony (ponieważ widok jest załadowany, jak sądzę), a pozostałe ikony nie pojawiają się, dopóki ich nie kliknę.

Czy muszę wdrożyć self.tabBarItem w innej metodzie niż viewDidLoad?

Z góry dziękuję wszystkim!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    tabBar = [[UITabBarController alloc] init]; 

    SubscriptionsController *subscriptionsController = [[SubscriptionsController alloc] init]; 
    FavoritesController *favoritesController = [[FavoritesController alloc] init]; 
    CategoriesController *categoriesController = [[CategoriesController alloc] init]; 
    TagsController *tagsController = [[TagsController alloc] init]; 
    HelpScreenController *helpScreenController = [[HelpScreenController alloc] init]; 

    tabBar.viewControllers = [NSArray arrayWithObjects: 
     subscriptionsController, 
     favoritesController, 
     categoriesController, 
     tagsController, 
     helpScreenController, 
     nil 
     ]; 

    [window addSubview:tabBar.view]; 

    // Override point for customization after application launch. 
    [window makeKeyAndVisible]; 
    return YES; 
} 

//The View 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    tabIcon = [[UITabBarItem alloc] initWithTitle:@"Abonime" image:[UIImage imageNamed:@"subscr.png"] tag:0]; 
    self.tabBarItem = tabIcon; 
    [tabIcon release]; 
} 

Odpowiedz

12

myślę, że należy ustawić właściwość tabBarItem w wyznaczonych inicjatora kontrolera widoku za (sądząc po kodzie, to musi być -init dla każdego z kontrolerów). W rzeczywistości kontroler paska kart jest wystarczająco inteligentny, aby załadować widoki na żądanie, czyli należy ustawić właściwość tabBarItem przed wysłaniem viewDidLoad.

Wydaje się, że przeciekasz wszystkie kontrolery widoku. Aby to naprawić, wykonaj następujące czynności:

SubscriptionsController *subscriptionsController = [[[SubscriptionsController alloc] init] autorelease]; 
+0

Dzięki dużo! :) działało bezbłędnie :) – Olsi

+0

Jak to zrobić w szybkim 2? – deepakssn

+0

To nadal rozwiązuje problemy w Swift - 7 lat później. – SQLiteNoob

4

Prawidłowo. Ikony nie są wyświetlane, ponieważ widok (inny niż pierwszy nie został jeszcze załadowany). I nie jest ładowany, dopóki nie dotkniesz widoku, ponieważ viewDidLoad nie zostanie wywołany do tego czasu.

usunąć kod w poszczególnych UIViewControllers viewDidLoad i Zrób to ...

NSArray *controllers = [NSArray arrayWithObjects: 
               [NSDictionary dictionaryWithObjectsAndKeys:@"SubscriptionsController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil], 
               [NSDictionary dictionaryWithObjectsAndKeys:@"FavoritesController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil], 
               [NSDictionary dictionaryWithObjectsAndKeys:@"CategoriesController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil], 
               [NSDictionary dictionaryWithObjectsAndKeys:@"TagsController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil], 
               [NSDictionary dictionaryWithObjectsAndKeys:@"HelpScreenController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil], 
               nil]; 

NSMutableArray *controllerArray = [NSMutableArray array] ; 

for (NSUInteger i = 0; i < [controllers count]; i++) 
{ 
    id newClass = [[NSClassFromString([[controllers objectAtIndex:i] objectForKey:@"class"]) alloc] init]; 
    UITabBarItem *tabItem = [[UITabBarItem alloc] init]; 
    tabItem.image = [[controllers objectAtIndex:i] objectForKey:@"icon"]; 
    tabItem.title = [[controllers objectAtIndex:i] objectForKey:@"title"]; 
    tabItem.tag = i; 
    [(UIViewController*)newClass setTabBarItem:tabItem]; 
    [tabItem release]; 
    [controllerArray addObject:newClass]; 
    [newClass release]; 
} 

tabBar.viewControllers = controllerArray; 
Powiązane problemy