2011-06-22 18 views
12

Me gustaría entender por qué si trato de establecer el valor (es decir, setAlphaValue o setTitle) para un objeto (como un NSButton) en el método init no ocurre nada, pero si llamo a la función setter en awakeFromNib funciona correctamente.init y awakeFromNib

@interface appController : NSObject { 
    NSButton *btn; 
} 
@end; 

@implementation appController 
-(void)awakeFromNib { 
    //it works 
    [btn setTitle:@"My title"]; 
} 

-(id)init { 
    self = [super init]; 
    if(self){ 
     //it doesn't works 
     [btn setTitle:@"My title"]; 
    } 
} 
@end 
+0

¿su botón es un IBOutlet? – Eimantas

Respuesta

37

salidas se establecen después-init y antes-awakeFromNib. Si desea acceder a los puntos de venta, debe hacerlo en el -awakeFromNib u otro método que se ejecute después de que se configuren los puntos de venta (por ejemplo, -[NSWindowController windowDidLoad]).

cuando se carga un archivo de punta:

  1. Los objetos en el archivo semilla se asignan/inicializa, que recibieron -init, -initWithFrame:, o -initWithCoder:
  2. Todas las conexiones se restablecieron. Esto incluye acciones, salidas y enlaces.
  3. -awakeFromNib se envía a objetos de interfaz, propietario del archivo y objetos proxy.

Puede leer más sobre el proceso de carga de la punta en el Resource Programming Guide.

+1

+1 por ser más rápido y más largo. :) – Eiko

+0

¡Gracias! respuesta perfecta (necesito esperar unos minutos para aceptarlo :)) – MatterGoal

+3

Me gustaría añadir esto: "El orden en que el código de carga de nib llama a los métodos de objetos awakeFromNib no está garantizado. En OS X, Cocoa intenta llame al método awakeFromNib del Propietario del archivo por última vez, pero no garantiza ese comportamiento. Si necesita configurar los objetos en su archivo nib más al momento de la carga, el momento más apropiado para hacerlo es después de que su llamada de carga nib regrese. En ese punto , todos los objetos se crean, inicializan y están listos para usar ". de la Guía de programación de recursos en esta respuesta. –

5

Cuando está en init, la vista no se configura correctamente y las salidas no están conectadas. Es por eso que usa awakeFromNib: en este caso: todo está configurado y listo para ser utilizado.