2010-08-06 10 views
36

en iPhone Hago UIViewController viewDidLoad y escribo algunos códigos de configuración para configurar la vista.
Pero, ¿cómo puedo hacer eso en NSViewController?
He tratado con loadView pero no funciona ... Tal vez he hecho algo mal No sé ...viewDidLoad en NSViewController?

PD: Acabo de empezar con la programación OSX/iOS, lo siento si pido algo estúpido :(

Respuesta

41

a partir de OS X 10.10, viewDidLoad está disponible y apoyado en NSViewController

Antes de eso, había que ir por esta pepita en release notes leopardos de las nieves:.

consejo para las personas que buscan -viewWillLoad y -viewDidLoad Métodos de NSViewController

Aunque NSWindowController tiene métodos -windowWillLoad y -windowDidLoad para que pueda sustituir la clase de NSViewController introducido en Mac OS 10.5 no tiene correspondiente -viewWillLoad y -viewDidLoad métodos. Puede anular - [NSViewController loadView] para personalizar lo que sucede inmediatamente antes o inmediatamente después de la carga de la punta hecha por un controlador de vista.

+1

gracias ok :) voy a utilizar - (void) loadView – TesX

+0

me han preguntado en http://stackoverflow.com/questions/4492485/when-programming-for-mac-os-x-is- Hay una carga equivalente a la vista, pero también podría preguntárselo: He leído esto en los documentos y he intentado jugar con loadView pero aún no puedo entender cómo ayuda hacer algo "inmediatamente después de cargar la punta". ".Tengo un NSTabView en el archivo xib que está conectado correctamente pero aún así siempre es 0x0 cuando guardo un punto de interrupción en loadView. –

+3

-1; ¡Obsoleto! El artículo vinculado ya no trata este tema. :( – Arafangion

48

Lo descubrí a los pocos minutos de publicar mi comentario. Agregar mi hallazgo como respuesta porque es un ejemplo que falta en los documentos. El siguiente código le dará el método viewDidLoad que desee. Es tan fácil de una manera que me pregunto por qué Apple no se ha implementado todavía en OS X.

- (void)viewWillLoad { 
    if([NSViewController instancesRespondToSelector:@selector(viewWillLoad)]) { 
     [super viewWillLoad]; 
    } 

    ... 
} 

- (void)viewDidLoad { 
    if([NSViewController instancesRespondToSelector:@selector(viewWillLoad)]) { 
     [super viewDidLoad]; 
    } 
} 

- (void)loadView { 
    BOOL ownImp = ![NSViewController instancesRespondToSelector:@selector(viewWillLoad)]; 

    if(ownImp) { 
     [self viewWillLoad]; 
    } 

    [super loadView]; 

    if(ownImp) { 
     [self viewDidLoad]; 
    } 
} 

Fuente original: http://www.cocoabuilder.com/archive/cocoa/195802-garbage-collection-leaks-and-drains.html

+7

Una posible da nger con esto es que Apple podría agregar los métodos '-viewWillLoad' y' -viewDidLoad' a 'NSViewController' algún día. Si es así, su anulación de esos métodos sería llamada dos veces. –

+0

¡Muchas gracias por esta solución! Estuve buscando durante semanas para esto. –

+1

@Mike ... Su preocupación es válida y ahora que 10.7 Lion se parece más a iOS, creo que puede que solo lo haga en Lion. Lo vigilaré para que no me preocupe, pero sí, tener los mismos nombres de funciones puede ocasionar problemas. –

-3

hmm es que también haría esto ...

- (void)viewWillLoad { 

    if (! bool_viewwillload) { 

     // execute the code 
     bool_viewwillload = true; 
    } 
} 

- (void)viewDidLoad { 
    if (! bool_viewdidload) { 

     // execute the code 
     bool_viewdidload = true; 
    } 
} 

y luego simplemente hacer la vista de carga como esto

- (void)loadView { 

    [self viewWillLoad]; 

    [super loadView]; 

    [self viewDidLoad]; 
} 
4

¿por qué no intente esto:

- (void) awakeFromNib{ 

//setup code 
NSLog(@"hello there"); 
} 
+1

Tiendo a evitar hacer cosas en 'awakeFromNib', ya que a veces se puede llamar más de una vez. Por ejemplo, al invocar 'makeViewWithIdentifier: owner:' y pasar self como propietario, se llamará a 'awakeFromNib'. Consulte https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/PopulatingView-TablesProgrammatically/PopulatingView-TablesProgrammatically.html. – Kyle

+0

kyle tengo el mismo problema, awakeFromNib llamado multiple time debido a makeViewWithIdentifier: owner –

9

Como de OSX 10,10 (Yosemite), ahora hay una -viewDidLoad, -viewWillAppear, -viewDidAppear, -viewWillDisappear en NSViewController. Ver WWDC 2014 - Storyboards and Controllers on OS X session para obtener más información, para saber cuando cada uno de ellos obtiene la llamada, etc.

Aquí está la parte pertinente de las 10.10 docs de cabecera acerca -viewDidLoad:

/* Called after the view has been loaded. For view controllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set. Default does nothing. */ - (void)viewDidLoad NS_AVAILABLE_MAC(10_10);

+0

Puedo confirmar esto .. a partir de Xcode6-B4 la regla de texto proporcionada por Apple para una subclase 'NSVewController' incluye' - (void) viewDidLoad {[super viewDidLoad ]; // Ver configuración aquí. } '! –

0

Parece que en 10.10, viewDidLoad ahora está en NSViewController.

Cuestiones relacionadas