2011-10-03 4 views
1

J'ai deux contrôleurs de vue et je veux partager une variable booléenne entre eux. Je crée donc une variable bool avec un @propery (nonatomic, céder) des deux côtés et d'un côté j'ai écritPartager une variable bool/NSNUmber entre deux contrôleurs de vue

newVC.myBool1 = self.myBool2; 

autre contrôleur de vue, je peux lire la valeur de la variable bool passé, mais Je dois le changer au contrôleur de deuxième vue ainsi je peux lire la valeur au contrôleur de première vue. Donc, je sais, ce n'est pas possible, parce que bool * c'est un type primitif.

J'ai donc utilisé NSNumber, mais cela ne fonctionne pas non plus. Le premier contrôleur de vue que je mis sur viewDidLoad

self.myBool1 = [NSNumber numberWithBool:NO]; 

Sur le second contrôleur de vue:

self.myBool2 = [NSNumber numberWithBool:YES]; 

Mais le premier contrôleur de vue la valeur est 0 - Non ... Il semble donc que la création de la new NSNumber n'est pas partagé avec le premier contrôleur de vue.

Que puis-je faire pour résoudre ce problème? Cordialement Tim

+0

@property (nonatomic, readwrite) pour bool – Narayana

+0

J'ai changé cela sur les deux contrôleurs de vue, mais cela ne fonctionne pas. Je pense qu'il passe le paramètre bool en tant que valeur pas comme référence? – Tim

Répondre

0

Vous avez beaucoup de choix, mais que vous devez utiliser dépend si les deux viewControllers ont besoin de notification lorsque la valeur change.

Si vous n'avez pas besoin de notification, le plus simple est d'utiliser une variable globale BOOL, bien que les puristes se moquent de la suggestion. Mais vraiment c'est deux lignes de code et vous avez terminé. Une autre option consisterait à stocker la valeur dans NSUserDefaults.

Si vous avez besoin d'une notification de modification dans chaque viewController, la conception la plus propre consiste à écrire une méthode "set" dans un viewController qui définit la valeur dans lui-même et l'autre viewController. Quelque chose comme:

-(void) setMyBool:(BOOL)newValue 
{ 
    myBool = newValue; 
    otherViewController.myBool = newValue; 
} 

Si vous souhaitez modifier la valeur de soit viewController, il devient un peu plus délicat parce que vous devez avoir chaque viewController conserver une référence à l'autre et assurez-vous de ne pas récursif lors du réglage de la valeur. Quelque chose comme:

-(void) setMyBool:(BOOL)newValue 
{ 
    if (self.busyFlag == YES) 
    return; 
    self.busyFlag = YES; 
    myBool = newValue; 
    otherViewController.myBool = newValue; 
    self.busyFlag = NO; 
} 

Une autre option serait d'utiliser NSNotifications pour changer la valeur et ont chaque classe viewController écouter la notification de changement. Et la suggestion de TheEye d'écrire une classe wrapper et de garder une référence à une instance de cette classe dans les deux viewControllers fonctionnerait aussi.

Si vous n'avez pas besoin de notifications de modification, je créerais simplement une variable globale BOOL et je continuerais avec le reste de l'application parce que c'est tellement facile, fiable et difficile à rattraper.

+0

Est-ce que je ne peux pas utiliser un pointeur de bool? – Tim

+0

Bien sûr, si cela vous rend heureux. Vous devez faire attention à ce que le BOOL pointé sur ne disparaisse pas tant que viewController est vivant, c'est pourquoi je pense qu'un global est un peu plus sûr. – EricS

0

Un objet NSNumber est immuable, donc vous ne pouvez pas l'utiliser comme ça. Si vous écrivez [NSNumber initWithxxx], vous créez en fait un nouvel objet.

Si vous souhaitez partager un number ou boolean entre plusieurs classes, vous devez créer votre propre classe wrapper avec setters et getters pour la valeur bool (ou sous-classe NSNumber). Cette classe vous pouvez partager entre les classes.

+0

Existe-t-il d'autres solutions simples? – Tim

+0

Cela ne devient pas plus simple - vous avez besoin d'un objet mutable à partager. En fonction de ce que vous voulez faire avec la variable partagée, d'autres solutions pourraient être mieux adaptées (comme un objet de gestion de valeur ou un singleton), mais pas plus simples. – TheEye

Questions connexes