2010-11-24 5 views
8

Unterklasse Ich möchte eine Unterklasse von NSWindow erstellen. Diese Unterklasse muss einige Elementvariablen initialisieren, bevor sie verwendet werden. Was ist der beste Weg, um die Initialisierung in objective c zu erfassen? Was ich finde ist, dass init selten auf eine Weise aufgerufen wird, die mir dies ermöglicht. NSWindow hat ein paar Initialisierungsvektoren, die ich überschreiben müsste. Muss ich jeden von ihnen überschreiben?Wie sollte ich NSWindow Initialisierung in Objective-C

Antwort

8

Jede Klasse haben. Dies ist die Init-Methode, die alle anderen Init-Methoden aufrufen. Das ist derjenige, der überschrieben wird. Die Dokumentation sagt Ihnen normalerweise, welcher der Initialisierer ist. Im Falle von NSWindow ist es:

initWithContentRect:styleMask:backing:defer:

Diese Methode ist der designierte Initialisierer für die NSWindow Klasse.

Neben dem initializer bezeichnet, sollten Sie auch -initWithCoder: außer Kraft setzen, wenn die Klasse Sie das Protokoll NSCoding Unterklasse implementiert. -initWithCoder: ist der Initialisierer, der verwendet wird, wenn eine Instanz aus einem Archiv (z. B. einer NIB-Datei) instanziiert wird.

Siehe The Designated Initializer in Apples "The Objective-C Programmiersprache".

+0

Während es stimmt, dass initWithCoder: ist eine zweite designierte Initialisierer, NSWindows mit IB erstellt werden nicht initialisiert mit initWithCoder:. Instanzen von 'Benutzerdefinierte Ansicht' und das generische Objekt des blauen Würfels fallen in dasselbe Boot. Die meisten anderen Objekte werden tatsächlich mit initWithCoder initialisiert: wenn sie aus einer NIB-Datei geladen werden. –

+0

@Jon: Danke für die Korrektur. –

+0

Die angegebene Initialisierungsverbindung ist inaktiv. [Hier] (https://developer.apple.com/library/mac/documentation/general/Conceptual/DevPedia-CoocoaCore/MultipleInitializers.html) ist das neue. –

2

Haben Sie versucht, die bestimmte initialiser zwingende sollte man sogenannte bezeichnet initializer

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen 

Documentation

+1

Im macOS 10.12 SDK ist der angegebene Initialisierer für NSWindow nicht der hier von Abizem angegebene, sondern der von Ole angegebene. Beachten Sie das Fehlen des letzten Parameters 'screen:'. –

+0

das praktisch unsichtbar 'Bildschirm:' param tho ... danke @JerryKrinock, ersparte mir einige Frustration – codrut