2011-10-03 53 views
1

我有两个视图控制器,我想在它们之间共享一个布尔变量。 所以我创建了一个布尔变量与两侧@propery(非原子,分配),并在一面我写在两个视图控制器之间共享一个布尔变量/ NSNUmber

newVC.myBool1 = self.myBool2; 

在其他视图控制器我可以读通过布尔变量的值,但我需要在第二个视图控制器中更改它,以便我可以在第一个视图控制器中读取该值。 所以我知道,这是不可能的,因为`布尔*它是一种原始类型。

所以我用NSNumber,但这也行不通。在第一个视图控制器我设置viewDidLoad

self.myBool1 = [NSNumber numberWithBool:NO]; 

在第二个视图控制器:

self.myBool2 = [NSNumber numberWithBool:YES]; 

但是第一视图控制器的值是0上 - NO ......如此看来,创建新的NSNumber不会共享给第一个视图控制器。

我能做些什么来解决这个问题? Regards Tim

+0

@property(nonatomic,readwrite)for bool – Narayana

+0

我改变了这两个视图控制器,但它不起作用。我认为它通过布尔参数作为价值而不是参考? – Tim

回答

0

您有很多选择,但您应该使用哪个取决于两个viewControllers是否需要有关值更改时间的通知。

如果你不需要通知,最简单的选择是使用全局变量BOOL,虽然纯粹主义者会嘲笑这个建议。但实际上这是两行代码,你完成了。另一种选择是将值存储在NSUserDefaults中。

如果您需要在每个viewController中更改通知,也许最简洁的设计是在一个viewController中编写一个“set”方法,该方法在其自身和另一个viewController中设置值。喜欢的东西:

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

如果您想将价值从任的viewController改变,它变得有点麻烦,因为你必须有各自的viewController保持到其他的引用,并确保不设定值时,递归。喜欢的东西:

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

另一个选择是使用NSNotifications更改数值,让每个类的viewController监听变更通知。 TheEye建议编写一个包装类,并在viewController中保持对该类的实例的引用也可以。

但是,如果您不需要更改通知,那么我会创建一个全局变量BOOL,并继续处理应用程序的其他部分,因为它非常容易,可靠且难以搞砸。

+0

我不能使用布尔指针吗? – Tim

+0

当然,如果它让你开心。你必须小心,当viewController处于活动状态时,指向的BOOL不会消失,这就是为什么我认为全局更安全。 – EricS

0

NSNumber对象是不可变的,所以你不能像那样使用它。如果你写[NSNumber initWithxxx],实际上你创建了一个新的对象。

如果你想分享一个numberboolean几个类之间,你应该创建getter和setter方法为布尔值(或子类NSNumber)自己的包装类。你可以在课堂上分享这个课程。

+0

还有其他简单的解决方案吗? – Tim

+0

它没有得到任何简单 - 你需要一个可变对象分享。根据你想要对共享变量做什么,其他解决方案可能更适合(比如值管理对象或单例),但并不简单。 – TheEye

相关问题