2013-04-22 8 views
20

Che cos'è lo viewDidLoad per UIView?viewDidLoad per UIView?

Ho un UIView con xib. Vorrei nascondere una delle sue sotto-visualizzazioni quando è caricata. Ho provato ad usarlo.

- (id)initWithCoder:(NSCoder *)aDecoder{ 
    .... 
    _theView.hidden = YES; 
} 

Ma la visualizzazione secondaria _theView è pari a zero, a questo punto.

This answer non mi ha aiutato, perché al momento della creazione del UIViewController, il UIView non è stato ancora creato. Viene creato programmaticamente, in seguito.

+0

se il tuo UIView è "creato programmaticamente, in seguito", rimuovi la sottoview a questo punto –

+0

Voglio che tutto il codice relativo a UIView, si trovi nella classe di UIView – Luda

+0

La risposta accettata è fuorviante. Ho aggiunto una risposta più dettagliata. – Segev

risposta

13

AwakeFromNib viene chiamato solo se la vista caricato dal file nib. layoutSubviews viene chiamato per tutte le visualizzazioni, è possibile aggiungere bool _loaded = yes; nella funzione layoutSubviews e sapere se la vista è stata caricata.

+1

ricorda di chiamare super su tutti questi metodi: D – wolffan

+0

awakeFromNib sarà sempre chiamato e non c'è davvero bisogno di usare 'layoutSubviews' qui. – Segev

+1

@Segev, Quindi se awakeFromNib viene chiamato quando si usa pennino o storyboard, non si può chiamare se la vista è stata creata programmaticamente? Solo .h e .m o .swift. Se è così, allora la tua risposta è sbagliata e risvegliata. Non è sempre chiamato. – Luda

26

Prova

-awakeFromNib metodo

O nel XI ter impostare la proprietà vista nascosta per la vostra visualizzazione secondaria

+0

@Luda Penso che questa risposta sia ancora sufficiente per la tua domanda. Perché una taglia ora ... sembra chiusa prima? –

6

La risposta accettata è fuorviante. awakeFromNib verrà sempre chiamato, non solo se viene utilizzato un pennino. Dalla documentazione di mele:

awakeFromNib:

prepara il ricevitore per il servizio dopo che è stato caricato da un archivio di Interface Builder, o un file pennino.

Link

Nel prossimo esempio ho usato solo uno storyboard È possibile verificare questo molto facilmente.

Questa è la nostra ViewController:

enter image description here

ViewController.m:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"viewDidLoad"); 
} 

-(void)awakeFromNib 
{ 
    NSLog(@"awakeFromNib in view controller"); 
} 

@end 

RedView.m:

#import "RedView.h" 

@implementation RedView 

-(void)awakeFromNib 
{ 
     NSLog(@"awakeFromNib inside RedView"); 
     self.green.hidden = YES; 
} 

@end 

Ordine di stampa:

  1. awakeFromNib in vista del regolatore
  2. awakeFromNib all'interno Redview
  3. viewDidLoad

E naturalmente la vista verde sarà nascosto.


Edit:

awakeFromNib non sarà chiamato se si utilizza solo il codice per creare la vostra vista, ma si può chiamare se stessi o, meglio ancora, creare il proprio metodo.

Esempio senza StoryBoard (solo codice):

RedView.m:

#import "RedView.h" 

@implementation RedView 

-(void)loadRedView 
{ 
    NSLog(@"loadRedView"); 
    self.green = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    self.green.backgroundColor = [UIColor greenColor]; 
    [self addSubview:self.green]; 
    self.green.hidden = YES; 
} 
@end 

ViewController.m:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.red = [[RedView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; 
    self.red.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:self.red]; 
    [self.red loadRedView]; 
} 

@end 
+0

Quindi se awakeFromNib viene chiamato quando si usa pennino o storyboard, non si può chiamare se la vista è stata creata programmaticamente? Solo .h e .m o .swift. Se è così, allora la tua risposta è sbagliata e risvegliata. Non è sempre chiamato. – Luda

+0

Come suggerito dai documenti Apple, 'Prepara il ricevitore per il servizio dopo che è stato caricato da un archivio di Interface Builder o da un file di pennino. Quindi non verrebbe chiamato, ma puoi semplicemente chiamarlo da solo! Ho modificato la risposta. – Segev

+0

Ma quello è un hack. Si suggerisce di chiamare la funzione relativa al pennino, quando non è coinvolto il pennino – Luda

0

layoutSubviews saranno richiedono tutte le viste è possibile impostare la visualizzazione come nascosta invece di awakeFromNib. Se si utilizza xib, è possibile impostare la proprietà nascosta predefinita.

1

Non esiste un tale metodo in generale. La domanda è, da dove proviene il tuo _theView.

Se la vostra vista, compresa la sua visualizzazione secondaria, viene caricato dallo stesso pennino/XI ter/storyboard quindi è possibile utilizzare awakeFromNib che sarà chiamato dopo la gerarchia di oggetti completo è stato caricato dall'archivio, così il vostro _theView dovrebbe essere impostato come bene.

Se la tua vista è creata a livello di codice ma non crea la sottoview per _theView, ciò significa che deve esserci un posto nel codice in cui si aggiunge tale sottoview. In questo caso si hanno due opzioni

  • O nascondere _theView dal chiamante dopo aver aggiunto che
  • o dichiarare un metodo prepareForDisplay (o simile) sulla classe di visualizzazione e chiamare che dopo il vostro punto di vista è stato creato e _theView è stato assegnato. In quel metodo prepareForDisplay (o qualsiasi altro nome tu scelga) puoi fare quello che vuoi, ad es. nascondi _theView.

non mi consiglia di abusare layoutSubviews per questo in quanto è, per uno scopo diverso e sarà chiamato più volte durante il corso della vita di una visione, non solo una volta, come si vuole che sia. Sì, puoi salvare se è stato chiamato prima, ma lo considererei anche un hackeraggio. È meglio creare il proprio metodo per inizializzare la vista nel modo desiderato dopo averlo configurato correttamente e chiamarlo.

+0

Una buona spiegazione e mi ha indirizzato nella giusta direzione. Grazie. – palme