ios - bar - uinavigationitem title color
iOS viewDidLoad para UIView (7)
En un ViewController, hay ViewDidLoad
para saber cuándo se ha cargado el VC.
Para una UIView, ¿qué método debo usar cuando se cargue la vista?
¿Se llamaría este método con cualquier init?
editar: No XIB, solo programáticamente.
En realidad, no tiene que hacer nada con viewDidLoad (), el método del controlador de vista, para la inicialización de su vista. Todo lo que quieras hacer, puedes hacerlo en el método init de view. Por ejemplo, en viewDidLoad () del controlador, hay algún código de inicialización:
- (void)viewDidLoad{
[super viewDidLoad];
// init your parameters here
}
Análogamente, en el método init de su vista:
- (id)initWithDelegate:(id)_delegate
{
self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain];
if (self) {
[super init];
self.delegate = _delegate;
// init your parameters here
return self;
}
return nil;
}
Luego, crea YourView desde el controlador de vista de esta manera:
YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];
Además, las cosas que desea hacer cuando su vista se cargó, puede colocar en el método layoutSubviews en su vista, así:
-(void)layoutSubviews{
[super layoutSubviews];
// init your parameters here, like set up fonts, colors, etc...
}
Creo que eso es lo que necesitas.
¡Aclamaciones!
No funciona del todo así.
- (void)viewDidLoad
no se llama cuando se carga el controlador de vista; se invoca cuando se carga la vista del controlador de vista.
Entonces puede crear el UIViewController, y los únicos métodos que serán llamados son los métodos de inicio utilizados para inicializarlo. La vista no se creará, el método - (void) viewDidLoad no se llamará, etc.
Luego, cuando otra persona le pregunte al controlador de vista por su vista, a través de:
viewController.view;
El controlador de vista luego llama:
- (void)loadView; // This is where you put your own loading view information, and set the viewController''s self.view property here.
Seguido por:
- (void)viewDidLoad;
Ver Did Load es un método separado, por lo que no tiene que interrumpir el método loadView real y las opciones de carga de la vista compleja. La creación de subclases y la anulación del método loadView cuando se utilizan plumillas, etc. pueden provocar problemas cuando los desarrolladores no están seguros de lo que Apple está haciendo y cuáles son sus mejores prácticas, por lo que fue inteligente para Apple separar el método.
Luego, cuando aparece una advertencia de memoria, se libera la vista y se establece en nil:
- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
Por lo que sé, no creo que exista ese método, excepto el init. Usualmente hago la preparación en el método init. Puede crear su propio método viewDidLoad
y llamarlo manualmente. Pero la mayoría de las veces, UIView es administrado por su controlador de vista, por lo que el controlador de vista debe saber cuándo se carga la vista, si desea configurar la vista, puede hacerlo en el controlador de vista. Por cierto, el método viewDidLoad
no siempre se llama.
Puede usar willMove (toSuperview newSuperview: UIView?)
import UIKit
final class myView: UIView {
override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
//Do stuff here
}
}
Si lo carga desde un archivo XIB, se llamará al método awakeFromNib cuando se cargue desde el XIB.
editar En el caso de que no exista XIB, probablemente tendrá que inferirlo usando uno de los métodos del área Observando cambios relacionados con la vista de los documentos (por ejemplo, didMoveToSuperview). Sin embargo, una mejor manera es enviar un mensaje a sus vistas desde el controlador de vista en el método viewDidLoad.
Tuve un problema similar y encontré una solución relativamente fácil. Idea es enviar viewDidLoad a cada vista secundaria en el momento correcto y sobrecargar ese método en la clase que le interese.
Para hacer eso, agrega estas partes del código en tus clases ...
// UIViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view viewDidLoad];
}
// UIView+Loading.m
#import < UIKit/UIKit.h>
@implementation UIView (Loading)
- (void)viewDidLoad
{
for (UIView* subview in self.subviews)
[subview viewDidLoad];
}
@end
// UIView+Loading.h
#import < UIKit/UIKit.h>
@interface UIView (Loading)
- (void)viewDidLoad;
@end
// UIView_CustomImplementation
- (void)viewDidLoad
{
NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called");
}
Swift 2:
import UIKit
class myView: UIView {
override func layoutSubviews() {
print("run when UIView appears on screen")
// you can update your label''s text or etc.
}
}