我有两个视图控制器,我想在它们之间共享一个bool变量。 所以我创建了一个bool变量,两边都是@propery(非原子,赋值),一边是我写的
newVC.myBool1 = self.myBool2;
在另一个视图控制器上,我可以读取传递的bool变量的值,但是我需要在第二个视图控制器上更改它,这样我就可以在第一个视图控制器上读取它。 所以我知道,这是不可能的,因为`bool *它是一种原始类型。
所以我使用了NSNumber
,但这也行不通。在第一个视图控制器上,我设置了viewDidLoad
self.myBool1 = [NSNumber numberWithBool:NO];
在第二个视图控制器上:
self.myBool2 = [NSNumber numberWithBool:YES];
但是在第一个视图控制器上,值为0 - 否...因此,似乎不会向第一个视图控制器共享创建新的NSNumber
。
我该怎么做才能解决这个问题? 问候蒂姆
答案 0 :(得分:0)
NSNumber
对象是不可变的,所以你不能那样使用它。如果你写[NSNumber initWithxxx]
,实际上你创建了一个新对象。
如果要在多个类之间共享number
或boolean
,则应创建自己的包装类,其中包含bool值(或子类NSNumber
)的setter和getter。这个课你可以在课堂之间分享。
答案 1 :(得分: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建议编写一个包装类并在两个viewControllers中保持对该类实例的引用也会起作用。
但是,如果您不需要更改通知,我只需创建一个全局BOOL
变量并继续使用其他应用程序,因为它非常简单,可靠且难以搞定。