我有点问题而且我不知道如何解决它:
我在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>
我不知道放在哪里以及如何使用它......请帮助我
答案 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调用中删除观察者。