2013-10-19 11 views
9

Ich habe eine Klasse Suchleiste mit einem Delegaten didSelectString. Ich habe eine Klasse A, die den Delegaten implementiert, und eine Klasse B, die den Delegaten implementiert.mehrere Listener für Delegierte iOS

Es wird jedoch nur der Delegat der Klasse A ausgeführt. Kann ein Delegat mehrere Listener haben? und wie implementiere ich dies

+0

Das Standard-Delegiertenmuster hat nur einen Zeiger auf das Delegatobjekt und daher nur einen Delegaten. Sie können jedoch den Delegatclient so programmieren, dass er ein Array von Delegaten verwaltet, oder Sie können einen Delegaten so programmieren, dass er auf eine Sekunde "kaskadiert" wird. –

Antwort

14

Die Delegation ist ein einziges Messaging-Protokoll. Sie müssen NSNotifications verwenden, wenn Sie mehrere Objekte einer Änderung melden möchten.

Sie können ein Objekt mit Benachrichtigungen Zentrum wie so passieren:

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

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

Wenn für Benachrichtigungen

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

Und die Einrichtung der Wähler

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

Kann ich ein Objekt mit der Benachrichtigung übergeben? –

+0

Nur die Antwort aktualisiert, viel Glück mit dem, was Sie tun! –

+3

Vergessen Sie nicht removeObserver bei der Freigabe –

0

Erstellen Sie eine kleine hören wollen neue Klasse namens Delegates. Lassen Sie das Protokoll der Suchleiste übernehmen, damit es der primäre Suchleisten-Delegat sein kann. Lassen Sie diese Klasse eine Methode 'addSearchBarDelegate:' anbieten, in der der Delegat einem veränderbaren Array hinzugefügt wird. Wenn eine Delegatnachricht empfangen wird, wird sie an jeden registrierten Delegaten weitergeleitet.

3

Sie können problemlos ein Trampolin-Objekt einrichten, das als Delegate-Multiplexer fungiert. Die Idee besteht darin, ein Proxy-Objekt zu verwenden, das für ein Array von Delegierten bereitsteht. Wenn eine Methode aufgerufen wird, überschreibt sie forwardInvocation oder * IMP_implementationWithBlock *, um die Nachricht an alle Delegaten im Array weiterzuleiten.

Dann alles, was Sie tun müssen, ist es, Methoden hinzufügen: attachListener und removeListener (btw: sehen, wie dies ähnlich wie Benachrichtigungen zu erhalten beginnt?)

Hier ist ein Beispielprojekt: https://github.com/aleph7/MultiDelegate

Weitere Informationen Check aus dem genialen Objective-C Laufzeit: https://developer.apple.com/library/mac/documentation/cocoa/reference/objcruntimeref/Reference/reference.html

+0

Dank für eingehende Antwort. Jeder kennt NSNotifications, aber nicht alle bevorzugen sie. – user1244109