2009-05-06 8 views
14

Nun, ich denke zu wissen, was der App-Delegat tut. Es hat einige nette Methoden wie -applicationDidFinishLaunching, das aufgerufen wird, wenn die App fertig ist, und so weiter. Aber was ist das eigentlich? Ist dieses Objekt in der UIApplicationMain-Funktion instanziiert?Was beschreibt den Anwendungsbeauftragten am besten? Wie passt es in das gesamte Konzept?

Und wie funktioniert es, dass jede Klasse in meiner App Zugriff auf dieses App-Delegate-Objekt hat? Gibt es ein gutes Diagramm im Netz, das diese Beziehungen visualisiert?

Antwort

34

In Cocoa, ein Delegierter ist ein Objekt, das ein anderes Objekt aufschiebt, um auf Fragen von Verhalten beeinflussen und informiert über Änderungen in seinem Zustand. Zum Beispiel ist ein UITableViewDelegate verantwortlich für die Beantwortung von Fragen darüber, wie UITableView sich verhalten soll, wenn Selektionen vorgenommen oder Zeilen neu geordnet werden. Es ist das Objekt, das das UITableView fragt, wenn es wissen möchte, wie hoch eine bestimmte Zeile sein soll. Im Model-View-Controller-Paradigma sind Delegaten Controller, und viele Delegierte enden in "Controller".

Das UIApplicationDelegate ist möglicherweise der Delegat für die UIApplication. Die Beziehung ist in Cocoa (Mac) etwas offensichtlicher als in Cocoa Touch (iPhone), da der NSApplication-Delegat das NSApplication-Verhalten direkter steuern kann (verhindert, dass die Anwendung beispielsweise beendet wird). Das iPhone erlaubt nicht viel Kontrolle über die UIApplication. Daher wird das UIApplicationDelegate hauptsächlich über Änderungen informiert, anstatt einen aktiven Entscheidungsprozess zu führen.

Das UIApplicationDelegate ist nicht überall in der App verfügbar. Die Singleton UIApplication ist ([UIApplication sharedApplication]) und durch sie können Sie ihren Delegaten finden. Dies bedeutet jedoch nicht, dass es für jedes Objekt in einer App angemessen ist, direkt mit dem App-Delegaten zu kommunizieren. Im Allgemeinen rate ich Entwicklern davon ab, zufällige Objekte mit dem App-Delegaten zu sprechen. Die meisten Probleme, die auf diese Weise gelöst werden, werden besser durch Singletons, NSNotification oder andere delegierte Objekte gelöst.

In Bezug auf die Erstellung, auf dem Mac gibt es nichts Magisches über den App-Delegaten. Es ist nur ein Objekt, das in den meisten Fällen von der NIB instanziiert und verdrahtet wird. Auf dem iPhone kann der Anwendungsdelegat jedoch leicht magisch sein, wenn er von UIApplicationMain() instanziiert wird. Der vierte Parameter ist ein NSString, der die Klasse des Anwendungsdelegaten angibt, und UIApplicationMain() erstellt einen und legt ihn als den Delegaten der sharedApplication fest. Auf diese Weise können Sie den Delegaten ohne NIB einrichten (etwas sehr Schwieriges auf dem Mac). Wenn der vierte Parameter für UIApplicationMain() gleich Null ist (wie in den Apple-Vorlagen), wird der Delegat genauso wie das Hauptfenster von der Haupt-NIB erstellt und verdrahtet.

+1

Danke für die Einsicht, Rob! Sicher, dass du kein Top-Apple-Ingenieur bist? ;) – Thanks

3

Das Objekt wird auf diese Weise instanziiert;

Die Hauptfunktion sucht nach der Hauptfeder in der Datei info.plist. Die Nib hat als App-Delegat, der auf eine Klasse festgelegt ist, die UIApplicationDelegates und die erforderlichen Methoden implementieren muss. Der App-Delegat lädt dann einen Viewcontroller.

Es dient als Anwendung breites Rückrufobjekt für Ereignisse, die die gesamte Anwendung, wie Low-Speicher usw.

Verwandte Themen