如何检测变更状态@property目标c

时间:2014-09-10 15:38:43

标签: ios objective-c detection propertychanged

我有点问题而且我不知道如何解决它:

我在SKspritekit中开发了一个小游戏,我会检测BOOL @property(播放/暂停)何时改变状态。 我的视图控制器(UIViewController类)是所有游戏的超级视图控制器,一个名为BackgroundCommon(NSObject类)的单例,包含@property BOOL暂停,其中存储了所有常见背景的方法,以及编写@proprety的SKSCENE backGroundCommon类。

当SKSCENE更改或按下按钮时......系统将写入@property。 我发现这个解决方案显然有效,但对我来说没有任何作用。 Link to official documentation

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

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

  • 对我来说,观察者想成为一个ViewController,在这里我必须实现一个backgroundcommon类(我不确定)

  • 是我的viewController Bank对象(如官方文档)?

  • 是我的backgroundCommon人物对象(如官方文档)?

我在ViewController上试过这个:

- (void)viewDidLoad {
    [super viewDidLoad];

    BackGroundCommon *bkc = [[BackGroundCommon alloc] init];
    [bkc addObserver:self forKeyPath:@"pause" options:NSKeyValueObservingOptionNew context:NULL];
}

然后我添加了这个(甚至在视图控制器上):

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog (@"working"); }

我尝试更改@property,但此消息显示在控制台中:

  

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

我不知道放在哪里以及如何使用它......请帮助我

2 个答案:

答案 0 :(得分:1)

您需要将观察者放在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");
}

稍后,要获取可在其他控制器中使用的值:

BackGroundCommon *bkc = [[BackGroundCommon alloc] init];
NSLog(@"PAUSE VALUE: %i", bkc.pause");

答案 1 :(得分:0)

似乎BKC对象已被释放,并且它的观察者也是如此。 如果observeValueForKeyPath在viewcontroller中,只需将[bkc addObserver ...]更改为[self addObserver ...]。

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