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



我有两个视图控制器,我想在它们之间共享一个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],实际上你创建了一个新对象。

如果你想在几个类之间共享一个numberboolean,你应该为bool值(或子类NSNumber)创建你自己的包装器类的setter和getter。这个类可以在类之间共享。

最新更新