2010-12-13 5 views
0

J'ai une application iPhone qui utilise un UINavigationController, des vues de table, et iAd. Au niveau supérieur, mon contrôleur de navigation affiche la barre de navigation. Aux niveaux inférieurs, ce n'est pas le cas.iPhone - code de structuration pour éviter une condition de concurrence

Le problème que j'ai est que parfois le cadre de mon niveau supérieur UITableView passe en dessous du bas de l'écran. La raison pour laquelle il se trouve est le suivant:

ma méthode viewWillAppear ressemble à ceci:

-(void) viewWillAppear:(BOOL)animated { 
    [self.navigationController setNavigationBarHidden:NO animated: animated]; // changing the last animated to NO does not help. 
    [super viewWillAppear:animated]; 
} 

et ma méthode de viewDidLoad ressemble à ceci:

- (void)viewDidLoad { 
[self.navigationController setNavigationBarHidden:NO animated: NO]; 
    [super viewDidLoad]; 
    [self createTableView]; 
    ADBannerView *abv = [[ADBannerView alloc]initWithFrame: [self initialBannerViewFrame]]; 
    abv.delegate=self; 
    [self.view addSubview:abv]; 
    self.bannerView = abv; 
    [self moveBannerViewOffscreen]; 
    [abv release]; 
} 

Enfin, moveBannerViewOffscreen ressemble à ceci:

Lorsque la vue est en cours de chargement, que se passe-t-il, même si j'ai appelé 01?
[self.navigationController setNavigationBarHidden: NO animated: NO]; 

le cadre de ma vue n'est pas immédiatement ajusté pour tenir compte de la barre de navigation. Cela est toujours vrai lorsque moveBannerViewOffscreen s'exécute. La hauteur de la vue de table est donc définie sur 480. Lorsque la barre de navigation entre, le résultat est que le bas de la vue de la table se trouve sous l'écran et que l'utilisateur ne peut pas sélectionner la dernière ligne.

Je suis sûr que je pourrais utiliser un NSTimer pour mettre en place une bidouille pour résoudre ce problème. Mais y a-t-il un moyen propre d'organiser mon code pour que le problème ne se pose pas en premier lieu?

Merci

Répondre

0

À première vue (sans en comprendre pleinement votre problème, je l'avoue), je pense que vous fixer en tant que délégué du contrôleur de navigation afin de tirer profit d'une de ces méthodes contribuerait à votre calendrier:

navigationController:didShowViewController:animated: 

navigationController:willShowViewController:animated: 

peut-être pas déplacer votre bannière jusqu'à ce que didShowViewController a été appelé.

(Toutes mes excuses si je n'ai pas suivi votre explication.)

+0

semble résoudre le problème, mais pour être sûr que je mis en place un BOOL pour garder la trace si la bannière est censée être visible et mis en déroute mon Les méthodes d'affichage/de disparition des bannières s'affichent à l'aide d'une méthode qui vérifie la valeur de BOOL. Mais la chose principale est. . . Au moment de l'appel de didShowViewContoller, la taille de la vue a été ajustée pour tenir compte de la barre de navigation. Merci. –

Questions connexes