我有两个视图控制器,我想在它们之间共享一个bool变量。因此,我创建了一个bool变量,两边都是@ property (nonatomic, assign)一边写着
newVC.myBool1 = self.myBool2;
在另一个视图控制器上,我可以读取传入bool变量的值,但我需要在第二个视图控制器上更改它,以便我可以在第一个视图控制器上读取值。所以我知道,这是不可能的,因为' bool*它是一个基本类型。
所以我使用NSNumber
,但这也不起作用。在第一个视图控制器上,我设置为viewDidLoad
self.myBool1 = [NSNumber numberWithBool:NO];
在第二个视图控制器上:
self.myBool2 = [NSNumber numberWithBool:YES];
但是在第一个视图控制器上,值是0 - NO…因此,似乎创建新的NSNumber
不共享到第一个视图控制器。
我能做什么来解决这个问题?认为蒂姆
你有很多选择,但是你应该使用哪个取决于当值改变时两个viewcontroller是否需要通知。
如果您不需要通知,最简单的选择是使用全局BOOL
变量,尽管纯粹主义者会嘲笑这个建议。但实际上只有两行代码,你就完成了。另一种选择是将值存储在NSUserDefaults
中。
如果你需要在每个viewController中都有更改通知,也许最干净的设计是在一个viewController中写一个"set"方法,在它自己和另一个viewController中设置值。比如:
-(void) setMyBool:(BOOL)newValue
{
myBool = newValue;
otherViewController.myBool = newValue;
}
如果你想改变任何一个viewController的值,它会变得有点棘手,因为你必须让每个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
变量,然后继续使用应用程序的其余部分,因为它非常简单,可靠并且很难搞砸。
NSNumber
对象是不可变的,所以不能这样使用它。如果你写[NSNumber initWithxxx]
,实际上你创建了一个新对象。
如果你想在几个类之间共享一个number
或boolean
,你应该为bool值(或子类NSNumber
)创建你自己的包装器类的setter和getter。这个类可以在类之间共享。