不要試圖將「知識」引入對象,只是爲了傳遞消息。我的意思是,如果你有你的ObjectBody,HudLayer和MainSetupScene對象(我將在這裏做一些假設),這樣設計...
MainSetupScene「擁有」HudLayer(爲此,你大概在MainSetupScene [self addChild:hudLayer];
)
MainSetupScene沒有 「擁有」 ObjectBody(同樣,你可能在MainSetupScene [self addChild:objectBody];
與hudLayer一樣)
現在,你想objectBody爲 「溝通」。不要試圖強迫對象的知識,反之亦然。只需使用代表。
因此,舉例來說,在你objectBody你可以聲明如下
@protocol ObjectBodyDelegate
-(void)objectBodyStateChanged;
@end
現在,您mainsetupscene會有它的定義爲
@interface MainSetupScene : CCScene<ObjectBodyDelegate>
...
現在,在您ObjectBody類,當你想發送消息給hud,使用代理[delegate objectBodyStateChanged];
這將由您的MainSetupScene處理。然後這將決定通過調用相關方法並設置適當的值(它可以從objectBody中獲取)來更新HUDLayer。
總之,身體告訴現場發生了一些事情,使其發生變化。現場知道需要更新哪些內容以反映這一變化。身體不應該知道這個hud存在,並且hud不應該知道身體存在。
除了我在這裏放置的代表,還有更多的代表,但是如果你四處搜尋,你會發現很多細節。
EDIT AFTER COMMENT 你的協議是在一類(類A)的接口中定義的,但實現被寫入另一個類(類B)。這就是爲什麼它被稱爲委託 - 你將工作委託給另一個班級。
您還需要定義和設置一個委託。所以,在A級.H你必須
@protocol ClassADelegate
-(void)doSomethingAfterSomethingChanged;
@end
@interface ClassA {
id <ClassADelegate> delegate;
}
@property (nonatomic, retain) id<ClassADelegate> delegate;
在A類.M實現,你必須
@implementation ClassA {
@synthesize delegate;
-(void)changeSomething {
... Do whatever you need to do ...
// Now call the delegate
[delegate doSomethingAfterSomethingChanged];
}
在B類的.h你必須
@interface ClassB<ClassADelegate> {
}
然後在.M執行,你必須
@implementation ClassB {
-(id)init {
.. Do whatever, but when you create your ClassA, set this as delegate ...
ClassA myClassA = [[ClassA alloc] init];
myClassA.delegate = self;
}
-(void)doSomethingAfterSomethingChanged {
// This gets called by ClassA
}
有很多關於代表的更好的教程可以解釋它比這更好。希望這會使它更清晰一些。您可能已經使用UITableView控件和iOS SDK中的其他許多功能。
看來你確實設計了正確的架構。你應該使用協議或繼承來反映你的對象的不同「角色」 – 2012-03-09 10:27:41
就像Nick Bull在下面說的那樣? – Bek 2012-03-09 14:21:57