2012-03-26 4 views
1

Meine Situation zu bestimmen:Der beste Weg, um das Verhalten einer Ansicht der enthaltenden Ansicht

ClassA kann oder auch nicht hat einen Elternteil vom Typ ClassB. Daher ist die Aussage [instanceOfA.superview somethingClassBSpecific]; halb gefährlich. Außerdem wird Xocde aus gutem Grund sauer werden.

hier ist die Empfehlung, eine Benachrichtigung zu versenden oder auf dem Superview eine gewisse Logik zu tun, zum Beispiel

if([objectOfA.superview respondsToSelector:somethingClassBSpecific] != nil){ 
    //... 
} 

oder einen Vertreter des Typs ClassB wo es die Umstände erlauben schaffen?

Antwort

3

Wie so oft der Fall, es hängt. Die Verwendung der Ansichtshierarchie, Benachrichtigungen und Delegierung sind drei verschiedene Möglichkeiten, mit denen Objekte miteinander kommunizieren können. Um zu entscheiden, welche von diesen (wenn überhaupt) am geeignetsten ist, muss darüber nachgedacht werden, wie die fraglichen Objekte zueinander in Beziehung stehen.

Benachrichtigungen bieten eine sehr lockere (fast Null) Kopplung zwischen Objekten. Sie stellen auch eine Eins-zu-viele-Kommunikation bereit - Sie veröffentlichen eine Benachrichtigung und jedes Objekt, das auf diese Benachrichtigung wartet, erhält die Nachricht. Aber Benachrichtigungen sind nicht immer angemessen. Die Kommunikation erfolgt hauptsächlich nur in einer Richtung, und der Missbrauch des Benachrichtigungsmechanismus kann zu Leistungsproblemen führen.

Delegierung gibt Ihnen eine Möglichkeit, das Verhalten eines Objekts anzupassen. Das offensichtlichste Beispiel ist der Anwendungsdelegat. Die meisten iOS-Anwendungen basieren auf derselben Klasse: UIApplication. UIApplication ist für jede App genau das gleiche, obwohl jede App ihr eigenes Ding macht. Das Anwendungsobjekt verwendet einen Delegaten, um die Anpassung bereitzustellen, die der Anwendung ihr eindeutiges Verhalten verleiht.

Die Ansichtshierarchie ist eine andere Möglichkeit, dass (einige) Objekte miteinander verbunden sind. Wenn das von Ihnen implementierte Verhalten a) Teil einer Ansicht und b) abhängig von der Beziehung dieser Ansicht zu anderen Ansichten ist, kann es sinnvoll sein, die Eigenschaften superview und subviews zu verwenden.

Also, welche Art von Funktionalität versuchen Sie zu implementieren?

2

Dies hängt von Ihrem logischen Modell ab. Wenn Sie eine Instanz einer Klasse haben, die ein Protokoll mit optionalen Methoden implementiert, ist die Verwendung von respondsToSelector: angezeigt, wenn Sie versuchen, eine dieser optionalen Methoden aufzurufen. Wenn Sie möchten, dass die von Ihnen aufgerufene Methode erforderlich ist, erstellen Sie in den übergebenen Klassen einen Do-nothing-Schutz. Beide Techniken sind gültig, es kommt nur darauf an, ob Sie möchten, dass Ihre Benutzer sich der Notwendigkeit bewusst sind, eine bestimmte Methode zu implementieren.