2013-01-06 53 views
0

我目前正在學習Obj-C和更具體的協議。我需要在這裏爲我的問題編寫一個場景才能說明問題。通過協議接收消息?

第一個示例(帶有代表)。

  1. 我是一個UIView子類,它從它的控制器請求信息顯示(或更確切地說應該如何顯示信息)。我宣佈的協議,並委託引用對象(或任何它被稱爲):

    @property (nonatomic, weak) id <protocolName> dataSource; 
    
  2. 我控制器符合本協議並實現所需的方法。

  3. 查看發送消息到控制器,和控制器回答,一切都很好。

這個據我所知是代表團通過協議,我相信我理解它。

但讓我們考慮另一種情況。

  1. 我是一個簡單的基於水平的遊戲的大腦的類。我說什麼時候顯示菜單或什麼時候開始玩遊戲關卡。 但是我需要知道一個關卡何時完成。

這意味着這個類需要準備好接收來自任何實現該協議的任何人的消息,例如從另一個負責當前級別的類。 現在這是我不明白。協議應該如何以及在何處/如何實施?

讓我知道如果我的問題仍然沒有意義。謝謝!

回答

1

委託是用於在實體之間發送消息的一對一關係方法。 如果您想收到來自不同班級的相同消息,可以使用NSNotification這是一對多關係。

看那NSNotificationCenter類,特別是postNotification方法(用於發送消息)和addObserver方法(當接收到的通知中使用)

編輯: 這裏的進行委派的示例代碼。

讓我們以您的遊戲級別爲例。您有一個LevelManager類和FirstLevel類。如果你想在LevelManager被通知當FirstLevel結束,你必須在你的FirstLevel某處聲明的協議在你的FirstLevel

// FirstLevel.h 
@protocol SomeProtocol <NSObject> 
-(void)levelDidEnd; 
@end 

@interface FirstLevel : NSObject 
@property (nonatomic, weak) id<SomeProtocol> delegate; 
@end 

然後。男,打電話的時候的水平結束了您的協議​​方法

// FirstLevel.m 
- (void)playGame { 
    if ([player isDead]) { 
     [delegate levelDidEnd]; 
    } 
} 

下一步是實現你的協議,您LevelManager:

// LevelManager.h 
@interface LevelManager : NSObject <SomeProtocol> 
@property (strong, nonatomic) FirstLevel *firstLevel; 
@end 

,然後設置你的firstLevel.delegate和實現協議方法

// LevelManager.h 
- (void)viewDidLoad { 
    firstLevel.delegate = self; 
} 

- (void) didLevelEnd { 
    // do actions here like showing the menu 
} 
+0

通過消息我的意思是方法,而不是通知。或者我不明白你的答案? –

+0

也許我是那個在這裏不明白的人。你是否要求一個代表團的例子代碼? – Yaman

0

你還可以跟團:

樂噸水平與類型id<LevelDelegate>

@protocol LevelDelegate <NSObject> 
-(void)completedLevel:(Level *)level; 
@end 

的BrainController符合LevelDelegate並創建所有電平的代表一個對象。對於每個級別,它將自己設置爲代表。

如果一個級別識別它已經完成,它會調用[self.delegate completedLevel:self];

BrainController得到通知,並做什麼是必要的。