2010-10-21 12 views

Antwort

2

Von Apple Dokumentation:

InitWithCoder kodiert für ein Objekt für die Archivierung. Ein Codierer weist das Objekt dazu an, indem er encodeWithCoder: oder initWithCoder: aufruft. encodeWithCoder: Weist das Objekt an, seine Instanzvariablen in den angegebenen Codierer zu codieren ...

InitWithNibName Gibt ein NSNib-Objekt zurück, das für die NIB-Datei im angegebenen Bundle initialisiert wurde. Nachdem die NIB-Datei geladen wurde, verwendet das NSNib-Objekt die Ressourcenzuordnung des Bundles, um zusätzliche Ressourcen zu finden, auf die die Nib verweist. Wenn Sie für den Bundle-Parameter nil angegeben haben, sucht das NSNib-Objekt stattdessen nach den Ressourcen in dem Bundle, das der Klasse des Eigentümers der NIB-Datei zugeordnet ist. Wenn die NIB-Datei keinen Eigentümer hat, sucht das NSNib-Objekt nach zusätzlichen Ressourcen im Hauptpaket der Anwendung.

Ersteres wird zum Codieren einzelner Objekte in Ihrem Code verwendet, letzteres wird zum Abrufen einer NSNib-Datei verwendet, die Ressourcenobjekte enthält.

5

initWithNibName: wird normalerweise mit einem View-Controller-Objekt verwendet. Die Idee ist, dass Sie eine NIB-Datei (oder XIB, die gleiche Sache) haben, die eine UIView (oder NSView) hat, die Sie bereits in Interface Builder entworfen haben. Wenn Ihr View-Controller gestartet wird, verfügt er über eine view-Eigenschaft und -Outlet, die Sie selbst zeichnen müssten - außer dass Sie es bereits in IB entworfen haben. Mit diesem Konstruktor können Sie also das neue Controller-Objekt starten und in der NIB-Datei angeben, welche Ansicht es anzeigen soll. Die Diskussion über die Verdrahtung Ihrer NIB selbst, um sicherzustellen, dass dies erfolgreich ist, ist ein wenig über das Thema hier hinaus.

initWithCoder: hat eine andere Aufgabe insgesamt. Wenn Sie ein Objekt unter Verwendung von encodeWithCoder: serialisiert haben, müssen Sie diese Daten schließlich aus dem Universum (oder "dekodieren") entfernen, um sie wieder in ein Objekt Ihrer Klasse umzuwandeln.

Wie auch immer, zur Erinnerung: Sie würden encodeWithCoder: und initWithCoder: für Ihre Klasse nur implementieren, wenn Sie möchten, dass Ihr Objekt das NSCoding Protokoll unterstützt. Sie verwenden initWithNibName: (normalerweise implementieren Sie es nicht selbst), wenn Sie ein Objekt auslösen möchten, das seine Eigenschaften mit Objekten initialisieren kann, die in einer NIB-Datei archiviert sind.

Es gibt einen wirklich tollen Überblick über NSCodingover here.

+1

ah, sieht aus wie Jordan hat es schon genagelt, unten ;-) –

1

Storyboard

Sie sollten nur -initWithCoder: zu -initWithNibName bevorzugen, da die ehemaligen aufgerufen wird, wenn eine Ansicht von Storyboard geladen.