2013-10-19 120 views
9

我有一個帶有委派didSelectString的類搜索欄。我有一個實現委託的類A和一個實現委託的類B.代表iOS的多個偵聽器

但是隻有A類的委託纔會被執行。代表可以有多個監聽器嗎?我該如何實現這個

+0

標準委託模式只有一個指向委託對象的指針,因此只有一個委託。但是,您可以編寫委託客戶端來維護一組委託,或者您可以將一個委託編碼爲「級聯」到另一個委託。 –

回答

14

該委託是一個單一的消息傳遞協議。如果您想要發送更改的多個對象,則需要使用NSNotifications。

您可以通過使用通知中心,像這樣的對象:

NSDictionary *userInfo = @{@"myObject" : customObject}; 

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
[nc postNotificationName:@"myNotificationString" object:self userInfo:userInfo]; 

如果想監聽通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myCustomObserver:)name:@"myNotificationString" object:nil]; 

和設置選擇

-(void)myCustomObserver:(NSNotification *)notification{ 
    CustomObject* customObject = notification.userInfo[@"myObject"]; 
} 
+0

我可以通過通知傳遞一個對象嗎? –

+0

剛剛更新了答案,祝你好運! –

+3

不要忘記調用removeObserver時釋放 –

0

創建一個小新班級稱爲代表。是否採用搜索欄協議​​,以便它可以成爲主要的搜索欄代表。讓這個類提供一個方法'addSearchBarDelegate:',它將把委託添加到一個可變數組中。當它獲取委託消息時,它將它轉發給每個註冊的委託。

3

你可以很容易地設置一個充當委託多路複用器的蹦牀對象。這個想法是使用一個代理對象,它將代表一組代表。當調用方法時,它將覆蓋forwardInvocation或使用* IMP_implementationWithBlock *將消息傳遞到數組中的每個委託。

然後,所有你需要做的是添加方法:attachListener和的removeListener(順便說一句:看到這是如何開始得到類似通知?)

這裏有一個樣本項目:https://github.com/aleph7/MultiDelegate

欲瞭解更多信息檢查出色的Objective-C運行時間:https://developer.apple.com/library/mac/documentation/cocoa/reference/objcruntimeref/Reference/reference.html

+0

感謝您的深入解答。每個人都知道NSNotifications,但不是都願意使用它們。 – user1244109