2012-06-24 69 views
0

我想從HelloWorldLayer發送消息,並在ScoreLayer中接收消息,以更新標籤。該CCLOG(@"///addNewScore");工作正常,但然後updateScore,在ScoreLayer,沒有收到電話,你知道爲什麼嗎?這裏是我的代碼:(編輯:我試圖用@property「保留」,但沒有任何變化):爲什麼我的自定義委託方法沒有收到呼叫?

@interface HelloWorldLayer : CCLayer 
{ 
    //... 
    id<ScoreDelegate>delegate; 
} 

@property (nonatomic,retain) id <ScoreDelegate> delegate; 


@implementation HelloWorldLayer 
@synthesize delegate; 
//... 
-(void)addNewScore:(int)num{ 
    CCLOG(@"///addNewScore");//works fine 
    [delegate updateScore:num]; 
} 


#import <Foundation/Foundation.h> 

@protocol ScoreDelegate 
-(void)updateScore:(int)num; 
@end 

@interface ScoreLayer : CCLayer <ScoreDelegate>{ 
    //... 
} 

-(void)updateScore:(int)num{ 
    CCLOG(@"hello");//DOES NOT WORK 
} 

@end 

非常感謝

+2

你沒有顯示你設置'HelloWorldLayer'的'delegate'屬性的地方。我以爲你在做這個地方? – mttrb

+0

@mttrb:對不起mttrb你是什麼意思?關於委託的所有代碼都在上面,我錯過了什麼嗎? – Paul

+2

澄清:我們正在尋找的代碼將如下所示:'anHelloWorldLayer.delegate = aScoreLayer',以及上下文,例如代碼中出現的位置。 –

回答

2

我懷疑ScoreLayer被你的電話之前發佈。我不太熟悉assign,我只寫了ARC Objective-C;但我認爲它大致相同(因爲它應該是代表)。這意味着爲了使指針有效,應用程序中的其他人需要「擁有」ScoreLayer。

現在,這就是說,我只假定你正確地連接兩個對象的第一個地方。沒有發佈代碼表明這一點,但是可能發佈的ScoreLayer的這個問題非常重要,可以牢記兩種方式。

+0

感謝ctrahey,我用'@property(nonatomic,retain)'試過了,但沒有改變。代表照顧保留的事情不是嗎? – Paul

+0

你的代碼中沒有任何地方可以確定ScoreLayer的處理方式。根據你對上面@mttrb的迴應,你似乎錯過了一個關鍵的難題:沒有任何事實上*給一個HelloWorldLayer的ScoreLayer。 –

+0

哎呀,你是對的,它現在起作用!謝謝!我可以問你最後一個問題嗎?例如,要將分數從100更新爲500,我想要顯示100到500之間的數字,以便它不會直接從100到500,而是101,102 ... 499,500。但是這阻止了用戶界面半秒鐘或更長時間。你會只使用dispatchQueue嗎?非常感謝您的回答! – Paul

-2

您將在接口文件HelloWorldLayer中聲明該協議(委託方法)。然後,您可以把委託方法內ScoreLayer.m

-(void)updateScore:(int)num { 
    // Do something 
} 

現在的樣子,你宣佈在錯誤的類的協議。

+0

我不認爲聲明是在錯誤的地方,本身。一般來說,實現協議的類需要比在方法簽名中使用它的類更多地瞭解它。對於後者,我們應該在頭文件中使用前向聲明,並在實現文件中導入。在哪裏實際定義一個協議可能是非常主觀的,但它不需要與協議的消費者如此接近。 –

+0

而且,無論如何,這與代表未收到該信息的原因無關。 – Vervious