2010-12-11 33 views
11

Cette application que j'écris a un problème.UITabBarItems dans UITabBar afficher après que je clique sur l'élément pas lorsque l'application démarre

Je configure le UITabBar dans ma fenêtre d'application et je définis les icônes dans les fichiers de vue. Mais quand je lance l'application, les premières icônes apparaissent (parce que la vue est chargée je suppose) et les autres icônes n'apparaissent pas jusqu'à ce que je clique dessus.

Ai-je besoin de mettre en œuvre self.tabBarItem dans une autre méthode non viewDidLoad?

Merci d'avance à tous!

- (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]; 
} 

Répondre

12

Je pense que vous devez définir la propriété tabBarItem dans le initialiseur désigné un contrôleur de vue (à en juger à partir de votre code, il doit être -init pour chacun des contrôleurs). En fait, le contrôleur de la barre d'onglets est suffisamment intelligent pour charger les vues à la demande, c'est-à-dire que la propriété tabBarItem doit être définie avant que viewDidLoad ne soit envoyé.

En outre, vous semblez avoir des fuites sur tous les contrôleurs de vue. Pour résoudre ce problème, procédez comme suit:

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

Merci beaucoup! :) cela a fonctionné parfaitement :) – Olsi

+0

Comment est-ce que je fais cela dans swift 2? – deepakssn

+0

Cela résout encore les problèmes dans Swift - 7 ans plus tard. – SQLiteNoob

4

Correct. Les icônes n'apparaissent pas car la vue (autre que la première n'est pas encore chargée). Et ne se charge pas tant que vous n'avez pas appuyé sur une vue car viewDidLoad n'est pas appelée jusque-là.

Retirez le code dans le UIViewControllers individuels viewDidLoad et ce faire ...

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;