2010-11-24 5 views
8

? Quiero crear una subclase de NSWindow. esta subclase necesita inicializar algunas variables miembro antes de que se utilicen. ¿Cuál es la mejor manera de capturar la inicialización en el objetivo c? lo que encuentro es que init rara vez se llama de una manera que me permite hacer esto. NSWindow tiene un par de vectores de inicialización que necesitaría anular. ¿Necesito anular cada uno de ellos?¿Cómo debo crear una subclase de inicialización de NSWindow en Objective-C

Respuesta

8

Cada clase debe tener una llamada inicializador designado. Este es el método init que todos los demás métodos init llaman. Esa es la de anular. La documentación generalmente le dice cuál es el inicializador designado. En el caso de NSWindow, es:

initWithContentRect:styleMask:backing:defer:

Este método es el inicializador designado para la clase NSWindow.

Además del inicializador designado, también se debe anular -initWithCoder: si la clase subclase implementa el protocolo NSCoding. -initWithCoder: es el inicializador que se utiliza cuando se instancia una instancia de un archivo (como un archivo NIB).

Véase The Designated Initializer en "El lenguaje de programación Objective-C" de Apple.

+0

Si bien es cierto que initWithCoder: es un segundo inicializador designado, las NSWindows creadas con IB no se inicializan con initWithCoder :. Las instancias de 'Custom View' y el objeto genérico de cubo azul caen en el mismo barco. La mayoría de los otros objetos se inicializan con initWithCoder: cuando se cargan desde un archivo NIB. –

+0

@Jon: gracias por la corrección. –

+0

El enlace del inicializador designado está muerto. [Aquí] (https://developer.apple.com/library/mac/documentation/general/Conceptual/DevPedia-CocoaCore/MultipleInitializers.html) es el nuevo. –

2

has necesitado anulando el inicializador designado

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

Documentation

+1

En el macOS 10.12 SDK, el inicializador designado para NSWindow no es el indicado aquí por Abizem pero es el indicado por Ole. Tenga en cuenta la falta del último parámetro, 'pantalla:'. –

+0

que prácticamente invisible 'pantalla:' param tho ... gracias @JerryKrinock, me salvó un poco de frustración – codrut

Cuestiones relacionadas