2011-11-06 5 views
0

J'ai un contrôleur TabBar avec un élément de la barre d'onglets.Comportement étrange dans viewWillAppear

La première fois qu'un utilisateur appuie sur un élément de la barre d'onglets, je souhaite qu'un alertview soit ouvert, afin que l'utilisateur puisse lire quelques conseils d'instructions.

J'ai une variable globale (disons CONFIG), qui contient des valeurs booléennes (CONFIG.tip1AlreadySeen, CONFIG.tip1AllreadySeen, etc.). Toutes ces valeurs booléennes sont initialisées à NO.

Lorsque l'utilisateur appuie sur un élément de la barre d'onglets, la méthode viewWillAppear dans son viewcontroller est exécutée. Dans cette méthode, je mets un code comme celui-ci:

-(void) viewVillAppear: (BOOL) animated { 
    extern CONFIG; // <- it's not the actual code but it indicates that a global variable must be used 

    [super viewWillAppear: animated]; 

    if(CONFIG.tip1AlreadySeen == NO) { 
     CONFIG.tip1AlreadySeen = YES; 

     // code for showing the alertview 
    }  
} 

La chose étrange est que ce morceau de code fonctionne parfaitement dans un viewcontroller mais ne fonctionne pas dans un autre. Avec un peu de débogage, je libère que dans l'autre viewcontroller le code est exécuté mais l'assignation CONFIG.tipAlreadySeen = YES ne modifie pas la valeur réelle de CONFIG.tipAlreadySeen. Cette valeur est toujours NON. Incroyable!!!

Une petite solution utilisait la méthode viewDidAppear pour modifier la valeur:

-(void) viewVillAppear: (BOOL) animated { 
    extern CONFIG; // <- it's not the actual code but it indicates that a global variable must be used 

    [super viewWillAppear: animated]; 

    if(CONFIG.tip1AlreadySeen == NO) { 
     // code for showing the alertview 
    }  
} 

-(void) viewDidAppear: (BOOL) animated { 
    extern CONFIG; 
    CONFIG.tip1AlreadySeen = YES; 
} 

... Mais je ne comprenait vraiment pas ce qui est arrivé !!! Quelqu'un d'entre vous pourrait expliquer ce comportement?

Merci d'avance!

Marco

Répondre

0

Pourquoi faut-il être global et non contenue dans le contrôleur de vue lui-même? Juste un simple BOOL @property sur votre contrôleur de vue qui est basculé. Et pour maintenir cette persistance sur plusieurs exécutions de votre application, enregistrez le résultat dans NSUserDefaults, que vous vérifiez à chaque fois que vous initiez votre contrôleur de vue.

+0

Dans ce cas précis, vous avez raison: je n'avais pas besoin d'une variable globale. Mais pour maintenir la persistance sur plusieurs exécutions de mon application, j'ai créé un objet global CONFIG taht est écrit sur le disque lorsque l'utilisateur quitte l'application (en utilisant NSKeyedArchiver). Je n'ai pas encore essayé avec NSUserDefault, je vais jeter un oeil. Mais ma question reste: pourquoi dans un viewcontroller l'affectation CONFIG.tip1AlreadySeen = OUI et dans certains autres viecontrollers il n'est pas? – MarcoSciamanna