Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检测物业目标c的变更状态_Ios_Objective C_Detection_Propertychanged - Fatal编程技术网

Ios 如何检测物业目标c的变更状态

Ios 如何检测物业目标c的变更状态,ios,objective-c,detection,propertychanged,Ios,Objective C,Detection,Propertychanged,我有一个小问题,不知道如何解决: 我在SKspritekit中开发了一个小游戏,我会检测BOOL@property(play/pause)何时改变状态。 我有一个viewcontroller(UIViewController类),一个所有游戏的superviewcontroller,一个名为BackgroundCommon(NSObject类)的单例,其中包括一个@property BOOL pause,其中存储了公共背景的所有方法,还有一个SKSCENEs,它编写了BackgroundComm

我有一个小问题,不知道如何解决:

我在SKspritekit中开发了一个小游戏,我会检测BOOL@property(play/pause)何时改变状态。 我有一个viewcontroller(UIViewController类),一个所有游戏的superviewcontroller,一个名为BackgroundCommon(NSObject类)的单例,其中包括一个@property BOOL pause,其中存储了公共背景的所有方法,还有一个SKSCENEs,它编写了BackgroundCommon类的@proprety

当场景改变或按钮按下时。。。系统将写入@property。 我发现这个解决方案显然有效,但对我来说什么都不起作用。

如果我遵循此指南,问题是:

  • backgroundcommon类未实例化,因为该类用于存储方法

  • 对我来说,观察家想要一个ViewController,在这里我必须安装一个backgroundcommon类(我不确定)

  • 是否是我的viewController银行对象(如官方文档)

  • 我的背景是普通人的目标(像官方文件)

我在ViewController上尝试了以下操作:

- (void)viewDidLoad {
    [super viewDidLoad];

    BackGroundCommon *bkc = [[BackGroundCommon alloc] init];
    [bkc addObserver:self forKeyPath:@"pause" options:NSKeyValueObservingOptionNew context:NULL];
}
然后我添加了以下内容(即使在view controller上):

我试图更改@property,但控制台中出现以下消息:

类BackGroundCommon的实例0xc216b40已解除分配,而键值观察员仍在该实例中注册。观测信息被泄露,甚至可能被错误地附加到其他物体上。在NSKVODeallocateBreak上设置断点,使其在调试器中停止。以下是当前的观察信息: ( 上下文:0x0,属性:0xc218a40>


我不明白它放在哪里以及如何使用它…请帮助我

看起来BKC对象被释放了,它的观察员也被释放了。 如果observeValueForKeyPath在viewcontroller中,只需将[bkc addObserver…]更改为[self addObserver…]


另外,不要忘记在viewController的-(void)dealloc调用中删除观察者。

您需要将观察者放在BackGroundCommon中:

- (void)viewDidLoad {
   [super viewDidLoad];
   [self addObserver:self forKeyPath:@"self.pause" options:NSKeyValueObservingOptionNew context:nil];
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    NSLog (@"working");
}
稍后,要获取可在其他控制器中使用的值,请执行以下操作:

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog (@"working"); }
BackGroundCommon *bkc = [[BackGroundCommon alloc] init];
NSLog(@"PAUSE VALUE: %i", bkc.pause");

Thanx对于你的答案,我尝试了这个解决方案,但我仍然有一个问题…例如BackgroundCommon是SKscene,我使用它作为方法库。BackgroundCommon没有viewDidLoad方法。现在我尝试在viewController中拖动属性,并将observer放在viewDidLoad中,然后添加你在这里描述的方法。当我启动应用程序NS时Log(@“PAUSE VALUE:%i”,bkc.PAUSE”);有效,值为0(确定),但当我更改属性NSLog(@“working”)时,不会出现嗯…怀疑方法-(void)observeValueForKeyPath..不起作用,为什么?顺便说一句,我没有创建任何其他实例。好的,我更改了一些内容:1)我有三类数据管理器(管理数据并包含@property“bool”)2) BackGroundCommon(是一个真实的观察者,当获取游戏的待机通知时)3)ViewController(获取两个instance类bkg、mng和将观察者添加到mng实例)何时将更改此处的值background common get notification。(如果添加此项,则确定通知有效:mng.pause=@“你好,世界!“在viewController中运行,但只有一次,当我尝试更改@property时,什么都不会发生。我希望每次更改变量bool时都会收到通知。请帮助我…我的伙计们,我终于知道如何解决它了,之前的代码可以工作,但我使用它时是这样的:BackgroundCommon:-(void)observeValueForKeyPath:。。。{//这里的代码检测状态何时更改};在DataManager.h中,我添加了如下属性:@property(retain,nonatomic)NSString*pause;然后在我的WiewController中,我创建了如下两个实例:mng=[[DataManager alloc]init];bkg=[[BackGroundCommon alloc]init];[mng addObserver:bkg forKeyPath:@“pause”选项:NSKeyValueObservingOptionNew context:nil];并像以前一样在dealloc中添加代码。我希望这能帮助某人。使用ever message to instance not to ClassI使用此视图控制器解决了它:错误隐藏:-(void)dealloc{[mng removeObserver:self forKeyPath:@“pause”;}但我不确定是否是一个解决方案…:(