walmart usar precio marcas hershey entre diferencia componentes como chocolate bebida cocoa

cocoa - usar - initWithFrame no llamado, pero awakeFromNib es



componentes de la cocoa (2)

La respuesta oficial de Apple para esto es Crear una vista personalizada .

Las instancias de vista que se crean en Interface Builder no llaman a initWithFrame: cuando sus archivos de punta se cargan , lo que a menudo causa confusión. Recuerde que Interface Builder archiva un objeto cuando guarda un archivo nib, por lo que la instancia de vista ya se habrá creado y initWithFrame: ya se habrá invocado.

El método awakeFromNib proporciona una oportunidad para proporcionar la inicialización de una vista cuando se crea como resultado de la carga de un archivo nib. Cuando se carga un archivo de punta que contiene un objeto de vista, cada instancia de vista recibe un mensaje awakeFromNib cuando todos los objetos se han desarchivado. Esto proporciona al objeto la oportunidad de inicializar cualquier atributo que no esté archivado con el objeto en Interface Builder.

Estoy intentando subclasificar NSOutlineView. Aquí está mi código:

OutlineViewSublcass.h:

#import <Cocoa/Cocoa.h> @interface OutlineViewSubclass : NSOutlineView { } @end

OutlineViewSubclass.m:

#import "OutlineViewSubclass.h" @implementation OutlineViewSubclass - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; printf("debug A/n"); return self; } - (void)awakeFromNib { printf("debug B/n"); } @end

La salida de depuración es:

debug B

¿Por qué no se está (id)initWithFrame:(NSRect)frame ?


Los controles de cacao implementan el protocolo NSCoding para desarchivar desde un plumín. En lugar de inicializar el objeto usando initWithFrame: y luego establecer los atributos, el método initWithCoder: asume la responsabilidad de configurar el control cuando se carga utilizando los atributos serializados configurados por el Interface Builder. Esto funciona más o menos de la misma manera que cualquier objeto se serializa usando NSCoding.

Es un poco diferente si pega una subclase NSView personalizada en un plumín que no implementa NSCoding, en ese caso se llamará initWithFrame: En ambos casos, se llamará a awakeFromNib después de cargar el objeto, y suele ser un buen lugar para realizar una inicialización adicional en sus subclases.