2010-03-11 2 views
0

J'ai récemment procédé à une réorganisation de mon projet et maintenant je ne vois plus mon contrôleur de barre d'onglets, mais la vue de son premier contrôleur de vue apparaît. Voici une ventilation de tout ce qui se passe avant le problème.Mon UITabBarController n'apparaît pas, mais sa première vue est?

App Delegate charge FirstViewController avec nib. FirstViewController charge les données d'application à partir de mon serveur, puis présente MainViewController avec une transition modale. MainViewController est où UITabBarController est censé apparaître. C'est une classe très simple.

Le .h

@interface MainViewController : UIViewController <UITabBarControllerDelegate> { 
    IBOutlet UITabBarController *tabBarController; 
} 

@property (nonatomic, retain) UITabBarController *tabBarController; 

@end 

Le .m

@implementation MainViewController 
@synthesize tabBarController; 

- (void)viewDidLoad { 
NSLog(@"MainViewController viewDidLoad"); 


//set tab bar controller delegate to self 
tabBarController.delegate = self; 

// home view 
HomeViewController *home = [[HomeViewController alloc] initWithTab]; 

// menu view 
MenuViewController *menu = [[MenuViewController alloc] initWithTab]; 

// special offers view 
SpecialOffersViewController *so = [[SpecialOffersViewController alloc] initWithTab]; 

// events view 
EventsViewController *events = [[EventsViewController alloc] initWithTab]; 

// info view 
InfoViewController *info = [[InfoViewController alloc] initWithTab]; 

//populate the tab bar controller with view controllers 
NSArray *controllers = [NSArray arrayWithObjects:home, menu, so, events, info, nil]; 

tabBarController.viewControllers = controllers; 

//release view controllers 
[home release]; 
[menu release]; 
[so release]; 
[events release]; 
[info release]; 
[controllers release]; 

//add tab bar controller to view 
[self.view addSubview:tabBarController.view]; 

[super viewDidLoad]; 
} 

et ici le bit de FirstViewController qui présente la façon modale MainViewController ...

MainViewController *controller = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; 
    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:controller animated:YES]; 
    [controller release]; 

Je ne reçois pas toutes les erreurs ou les avertissements du compilateur et l'application s'exécute ... pas de plantage. Il ne montre pas le TabBar reproché, et il était utilisé quand je le créais sur mon AppDelegate. J'ai tout vérifié dans mon NIB et mes prises semblent être branchés ok. Je n'ai aucune idée de ce qui est arrivé. Aidez-moi!

Répondre

0

Je ne suis pas sûr que ce soit la cause de votre problème, mais il pourrait être:

Vous créez votre tableau de contrôleurs, comme ceci:

NSArray *controllers = [NSArray arrayWithObjects:home, menu, so, events, info, nil]; 

C'est très bien. controllers a un compte de retenue +0 (autoreleased).

Vous pouvez alors assigner à viewControllers propriété du tabBar:

tabBarController.viewControllers = controllers; 

C'est aussi très bien. controllers a maintenant un +1 nombre conserver (autorelease + conserver par tabBarController)

Vous relâchez controllers:

[controllers release]; 

controllers a maintenant un compte +0 retenir, ce qui signifie que la prochaine fois que runloop tourne, votre array va être désalloué, les vues suivantes disparaîtront (car elles ont été désallouées), et votre application finira probablement par s'écraser.

fix simple: Vous ne l'avez pas alloc, retain ou copy le tableau controllers, de sorte que vous n'êtes pas responsable de release il. Supprimez le release et votre gestion de la mémoire sera correcte. Cela pourrait résoudre votre problème, car c'est la seule chose que je vois immédiatement qui pourrait être un problème.

+0

Bon point, mais cela ne l'a pas résolu. Qu'est-ce qui finit par travailler était d'ajouter cela juste avant de définir la vue du contrôleur à la vue tabBarController. cadre CGRect = CGRectMake (self.view.frame.origin.x, \t \t \t \t \t \t \t self.view.frame.origin.y, \t \t \t \t \t \t \t self.view.frame.size .Width, \t \t \t \t \t \t \t self.view.frame.size.height); tabBarController.view.frame = frame; Je l'ai ramassé à partir de googler autour. Il ne semble pas juste que je devrais faire ceci, mais cela fonctionne. –

+0

En fait, [NSArray arrayWithObjects] génère un objet avec retain count 1, et il sera publié une fois dans le futur. Il ne peut pas renvoyer un objet avec retain count = 0 car cela signifierait qu'il est désalloué. –

+0

@Andrei droite. '+ 0' est une convention pour indiquer un objet autoreleased. ('+ 0'! =' 0') –

0

De la documentation:

Parce que la classe, les contrôleurs de la barre d'onglet classe UITabBarController hérite de la UIViewController ont leur propre point de vue qui est accessible par la propriété de la vue.Lors du déploiement d'une interface de barre d'onglets , vous devez installer cette vue en tant que racine de votre fenêtre. Contrairement à d'autres contrôleurs de vue, un onglet interface de barre ne doit jamais être installé en tant qu'enfant d'une autre vue contrôleur.

Questions connexes