2012-04-16 10 views
41

In un ViewController, c'è ViewDidLoad per sapere quando il VC è stato caricato.iOS viewDidLoad per UIView

Per un UIView, quale metodo devo usare quando viene caricata la vista?

Questo metodo può essere chiamato con qualsiasi init?

modifica: No XIB, solo a livello di programmazione.

+0

dipende da dove si è caricato da ... – borrrden

+0

hi grazie, Sto caricando la vista da una vistaController – MaKo

risposta

-6

Non funziona così.

- (void)viewDidLoad non viene chiamato quando viene caricato il controller di visualizzazione; viene chiamato quando viene caricata la vista del controller della vista.

Quindi è possibile creare UIViewController e gli unici metodi che verranno chiamati sono i metodi init utilizzati per inizializzarlo. La vista non verrà creato, il - (void) metodo di viewDidLoad non viene chiamato, ecc

Poi, quando qualcos'altro chiede al controller della vista per la sua vista, attraverso:

viewController.view; 

Il controller della vista quindi chiama :

- (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here. 

seguito da:

- (void)viewDidLoad; 

View è stato caricato è un metodo separato in modo da non lo fai è necessario interrompere il metodo loadView effettivo e le opzioni di caricamento della vista complessa. La sottoclasse e l'override del metodo loadView quando si usano pennini ecc. Può causare problemi quando gli sviluppatori non sono sicuri di ciò che Apple sta facendo e quali sono le loro migliori pratiche, quindi è stato intelligente per Apple separare il metodo.

Poi, quando arriva un avviso di memoria la vista viene rilasciata, e impostare a zero:

- (void)viewWillUnload; 
// view unloaded and set to nil. 
- (void)viewDidUnload; 
+54

come funziona in uiviewcontroller NOT UIView ... – ngb

+3

Questa risposta non riflette assolutamente il punto di domanda ... il richiedente non vuole alcun controller di visualizzazione. –

+1

risposta corretta è qui http://stackoverflow.com/a/4502761/2757496 – kaushal

30

Se lo si carica da un file XIB, verrà richiamato il metodo awakeFromNib quando viene caricato da XIB.

modificare In caso di mancata XIB, si avrà probabilmente inferire utilizzando uno dei metodi della Observing View-Modifiche correlate area di the docs (ad esempio, didMoveToSuperview). Tuttavia, un modo migliore è inviare un messaggio alle viste dal controller della vista nel metodo viewDidLoad.

+0

Ciao, grazie modificherò la mia domanda, senza XIB, ju st programatically – MaKo

+0

risposta eccellente, assolutamente corretto! – myusuf3

+0

Si attiva nuovamente se UIView viene ricaricato? – dumbledad

0

Per quanto ne so, non credo che ci sia un tale metodo ad eccezione del init. Di solito faccio la preparazione nel metodo init. Puoi creare il tuo metodo viewDidLoad e chiamarlo manualmente. Ma la maggior parte del tempo, UIView è gestito dal suo controller di visualizzazione, in modo che il controller di visualizzazione debba sapere quando viene caricata la vista, se si desidera configurare la vista, è possibile farlo nel controller della vista. A proposito, il metodo viewDidLoad non viene sempre chiamato.

+5

Non ho mai visto 'viewDidLoad' * not * called. In quali circostanze non sarebbe chiamato? – devios1

2

Ho avuto un problema simile e ho trovato relativa soluzione facile. L'idea è di inviare viewDidLoad a ogni visualizzazione figlio al momento giusto e sovraccaricare quel metodo sulla classe di tuo interesse.

Per fare ciò aggiungi questa parte di codice nelle tue classi ...

// 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"); 

} 
7

actualy, non hai a che fare nulla con metodo di visualizzazione del controller viewDidLoad(), per l'inizializzazione del vostro punto di vista. Tutto quello che vuoi fare, puoi farlo nel metodo init della vista. Per esempio, in viewDidLoad vista del controllore(), non v'è un certo codice di inizializzazione:

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    // init your parameters here 
} 

Analogamente, nel metodo init del tuo 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; 
} 

Poi, si crea YourView dalla vista di controllo in questo modo:

YourView view = [[YourView alloc] initWithDelegate:self]; 
[self.view addSubview:view]; 
[view release]; 

Inoltre, le cose che si vogliono fare quando la visualizzazione è stato caricato, è possibile inserire nel metodo layoutSubviews secondo lei, in questo modo:

-(void)layoutSubviews{ 
    [super layoutSubviews]; 

    // init your parameters here, like set up fonts, colors, etc... 
} 

Penso, questo è quello che ti serve.

Cheers!

4

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. 
    } 
} 
+1

Questo non ha nulla a che fare con Swift 2. È un punto di override per il layout basato sui vincoli. Citando il commento in framwork: "override point. Chiamato da layoutIfNeeded automaticamente. A partire da iOS 6.0, quando viene utilizzato il layout basato su vincoli, l'implementazione di base applica il layout basato su vincoli, altrimenti non fa nulla". –

+2

Attenzione: layoutSubviews può sparare più volte e non è certamente il posto dove fare alcun codice di installazione (come viewDidLoad) –

1

È possibile utilizzare WillMove (toSuperview newSuperview:? UIView)

import UIKit 

final class myView: UIView { 

    override func willMove(toSuperview newSuperview: UIView?) { 
    //Do stuff here 
    } 
} 

Apple Docs