在两个视图控制器之间共享bool变量/ NSNUmber

时间:2011-10-03 12:34:33

标签: iphone ios uiviewcontroller

我有两个视图控制器,我想在它们之间共享一个bool变量。 所以我创建了一个bool变量,两边都是@propery(非原子,赋值),一边是我写的

newVC.myBool1 = self.myBool2;

在另一个视图控制器上,我可以读取传递的bool变量的值,但是我需要在第二个视图控制器上更改它,这样我就可以在第一个视图控制器上读取它。 所以我知道,这是不可能的,因为`bool *它是一种原始类型。

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

self.myBool1 = [NSNumber numberWithBool:NO];

在第二个视图控制器上:

self.myBool2 = [NSNumber numberWithBool:YES];

但是在第一个视图控制器上,值为0 - 否...因此,似乎不会向第一个视图控制器共享创建新的NSNumber

我该怎么做才能解决这个问题? 问候蒂姆

2 个答案:

答案 0 :(得分:0)

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

如果要在多个类之间共享numberboolean,则应创建自己的包装类,其中包含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变量并继续使用其他应用程序,因为它非常简单,可靠且难以搞定。