簡體   English   中英

如何在屬性目標c中檢測更改狀態

[英]How detect change status @property objective c

我有一個小問題,但不知道如何解決:

我在SKspritekit中開發了一個小游戲,可以檢測BOOL @property(播放/暫停)何時更改狀態。 我有一個viewcontroller(UIViewController類),所有游戲的superviewcontroller,一個名為BackgroundCommon(NSObject類)的單例,其中包括一個@property BOOL暫停,並在其中存儲了通用背景的所有方法,還有一個SKSCENE,它編寫了一個@proprety的backGroundCommon類。

當SKSCENE將更改或按下按鈕時,系統將寫入@property。 我發現此解決方案顯然有效,但對我而言無效。 鏈接到官方文檔

如果我按照本指南進行操作,則會出現以下問題:

  • 沒有實例化backgroundcommon類,因為該類用於存儲方法

  • 對我來說,觀察者想成為一個ViewController,在這里我必須安裝一個backgroundcommon類(我不確定)

  • 是我的viewController Bank對象(例如官方文檔)嗎?

  • 是我的backgroundCommon Person對象(例如官方文檔)嗎?

我在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>

我不明白它放在哪里以及如何使用它...請幫助我

您需要將觀察者放入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");

似乎BKC對象已被釋放,它的觀察者也已釋放。 如果observeValueForKeyPath在視圖控制器中,則只需將[bkc addObserver ...]更改為[self addObserver ...]。

也不要忘記刪除viewController的-(void)dealloc調用上的觀察者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM