Anonyme Delegatobjekte in Objective-C erstellen

8

Cocoa verwendet Delegierte umfassend, um (unter anderem) Callback-Methoden für asynchrone Operationen bereitzustellen. Allerdings hasse ich persönlich das Delegatenmodell und wie es die aktuelle Klasse mit Handlern für sehr spezifische Kindoperationen verschmutzt. UIAlertView ist ein perfektes Beispiel.

Daher frage ich mich, ob es möglich ist, einfach ein anonymer Delegate-Objekt zu erstellen, das die Anforderungen eines Delegate-Protokolls (z. B. UIAlertViewDelegate ) über Blöcke erfüllt, und dieses anonyme Objekt überall dort zu übergeben, wo eine Delegiertenreferenz erwartet wird. p>

Ich stelle mir sowas vor:

%Vor%

Ich habe gehört, dass Objective-C einige gute dynamische Sprachfunktionen hat, aber ich weiß nicht, wie man einfach eine Methode / einen Selektor zu einem Objekt hinzufügt. Kann dies relativ einfach durchgeführt werden?

    
devios1 19.04.2013, 00:14
quelle

4 Antworten

5

Ja, die Sprachfunktionen, die Sie erwähnen, werden über die objective-c-Laufzeitumgebung , obwohl es keine eingebaute Möglichkeit gibt, Delegatklassen dynamisch zu erstellen, und die Laufzeit-API ist nicht die freundlichste Sache.

Es gibt eine Bibliothek namens A2DynamicDelegate , die genau das tut, wovon du sprichst. Ich habe es nicht benutzt, aber es könnte eine Untersuchung wert sein.

BEARBEITEN: Ein Problem bei diesem Ansatz besteht darin, dass Delegaten nicht beibehalten werden. Daher müssen Sie entweder eine starke Referenz an einer anderen Stelle beibehalten oder eine assoziative Referenz zur UIAlertView hinzufügen. Sie können feststellen, dass all diese Aufregung sich nicht lohnt und nur das Hinzufügen einer zusätzlichen Methode zu Ihrem View-Controller funktioniert besser (Sie können dem Delegate-Protokoll in einer Klassenerweiterung entsprechen, um eine Verschmutzung Ihrer Schnittstelle zu vermeiden).

    
Chris Devereux 19.04.2013, 01:30
quelle
3

Eine Option besteht darin, eine Klasse zu schreiben, die Ihre Blöcke für die einzelnen Methoden des Delegate-Protokolls in ein Delegate-Objekt einbindet. Für Details siehe diese Antwort .

    
CRD 19.04.2013 02:49
quelle
2

Sie sollten in Erwägung ziehen, eine Kategorie zu verwenden, die UIAlertView Blockunterstützung hinzufügt, die Ihren Anwendungsfall zu behandeln scheint. UIAlertView-Blocks ist mein Favorit, obwohl es viele andere gibt.

    
jszumski 19.04.2013 14:35
quelle
0

Wenn Sie Blöcke mit einer delegatorbasierten API verwenden möchten, müssen Sie einige Unterklassen erstellen. Siehe beispielsweise PSAlertView , wobei die Unterklassen UIAlertView eine blockbasierte API bereitstellen.

    
fumoboy007 19.04.2013 00:20
quelle

Tags und Links