2013-04-22 11 views
20

Was ist die viewDidLoad für UIView?viewDidLoad für UIView?

Ich habe eine UIView mit Xib. Ich möchte eine der Unteransichten ausblenden, wenn sie geladen ist. Ich habe versucht, das zu verwenden.

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

Aber die subview _theView ist gleich Null an dieser Stelle.

This answer hat mir nicht geholfen, becouse im Moment der Erstellung der UIViewController ist die UIView noch nicht erstellt. Es wird später programmatisch erstellt.

+0

Wenn Ihre UIView "programmatisch erstellt wird, später", entfernen Sie Ihre Unteransicht an dieser Stelle –

+0

Ich möchte alle für die UIView relevanten Code in der Klasse der UIView – Luda

+0

Die akzeptierte Antwort ist irreführend. Ich habe eine ausführlichere Antwort hinzugefügt. – Segev

Antwort

13

AwakeFromNib nur aufgerufen, wenn der Blick von NIB-Datei geladen. layoutSubviews wird für alle Ansichten aufgerufen, können Sie bool _loaded = yes; in der layoutSubviews Funktion hinzufügen und wissen, ob die Ansicht geladen ist.

+1

Denken Sie daran, alle Methoden aufzurufen: D – wolffan

+0

wakeFromNib wird immer aufgerufen und es ist wirklich nicht notwendig, 'layoutSubviews' hier zu verwenden. – Segev

+1

@Segev, Wenn wiseFromNib aufgerufen wird, wenn nib oder Storyboard verwendet wird, wird es nicht aufgerufen, wenn die Ansicht programmatisch erstellt wurde? Nur .h und .m oder .swift. Wenn ja, dann ist deine Antwort falsch und watchFromNib wird nicht immer aufgerufen. – Luda

26

Versuchen

-awakeFromNib Methode

Oder in xib stellen Sie die Ansicht Eigenschaft für Ihre Subview versteckt

+0

@Luda Ich denke, diese Antwort ist immer noch genug für Ihre Frage.Warum eine Bounty jetzt ... scheint ziemlich früher geschlossen? –

6

Die angenommene Antwort ist irreführend. wakeFromNib wird immer aufgerufen, nicht nur wenn eine Schreibspitze verwendet wird. aus dem Apple-docs:

awakeFromNib:

Bereitet den Empfänger für den Dienst, nachdem er von einer Interface Builder-Archiv oder NIB-Datei geladen wurde.

Link

Im nächsten Beispiel habe ich nur ein Storyboard verwendet habe du sehr leicht testen.

Dies ist unser 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 

Bestellung von Druck:

  1. awakeFromNib in View-Controller
  2. awakeFromNib innen RedView
  3. viewDidLoad

Und natürlich der Blick ins Grüne werden ausgeblendet.


Edit:

awakeFromNib nicht, wenn Sie Code verwenden, aufgerufen werden, um Ihre Ansicht zu erstellen, aber Sie können es selbst oder besser nennen noch Ihre eigene Methode erstellen.

Beispiel ohne Storyboard (nur Code):

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

Wenn watchFromNib also aufgerufen wird, wenn nib oder Storyboard verwendet wird, wird es nicht aufgerufen, wenn die Ansicht programmatisch erstellt wurde? Nur .h und .m oder .swift. Wenn ja, dann ist deine Antwort falsch und watchFromNib wird nicht immer aufgerufen. – Luda

+0

Wie die Apple-Dokumente vorschlagen: 'Bereitet den Empfänger auf den Service vor, nachdem er aus einem Interface Builder-Archiv oder einer NIB-Datei geladen wurde. So würde er nicht aufgerufen, aber Sie können ihn einfach selbst nennen! Ich habe die Antwort bearbeitet. – Segev

+0

Aber das ist ein Hack. Sie schlagen vor, die Funktion in Bezug auf die Feder aufzurufen, wenn die Feder keine Feder ist. – Luda

0

layoutSubviews für alle nennen wird Ansichten können Sie die Ansicht als versteckt anstelle von watchFromNib festlegen. Wenn Sie Xib verwenden, können Sie die ausgeblendete Standardeigenschaft festlegen.

1

Es gibt keine solche Methode im Allgemeinen. Die Frage ist, wo kommt dein _theView her.

Wenn Ihre Ansicht, einschließlich der Subview, aus der gleichen Feder/xib/Storyboard geladen wird, dann können Sie awakeFromNib verwenden, die nach der vollständigen Objekthierarchie aufgerufen wird, wurde aus dem Archiv geladen, so dass Ihre _theView sollte so eingestellt werden, Gut.

Wenn Ihre Ansicht programmgesteuert erstellt wird, aber nicht die Unteransicht für _theView selbst erstellt, bedeutet dies, dass in Ihrem Code ein Platz vorhanden sein muss, an dem Sie diese Unteransicht hinzufügen. In diesem Fall haben Sie zwei Möglichkeiten

  • Entweder _theView vom Anrufer verstecken, nachdem Sie es
  • hinzugefügt oder deklarieren eine prepareForDisplay Methode (oder ähnlich) auf Ihrer Ansichtsklasse und rufen, dass nach Ihrer Ansicht erstellt und _theView wurde wurde zugewiesen. In dieser prepareForDisplay (oder was auch immer Name Sie wählen) Methode können Sie tun, was auch immer Sie mögen, z. verstecken _theView.

Ich würde nicht zu missbrauchen layoutSubviews für diesen empfehlen, da es für einen anderen Zweck gedacht und wird mehrmals während der Lebensdauer einer Ansicht, nicht nur einmal aufgerufen werden, wie Sie es haben wollen. Ja, Sie können speichern, ob es vorher aufgerufen wurde, aber ich würde das auch als einen Hack betrachten. Erstellen Sie besser Ihre eigene Methode, um die Ansicht nach der korrekten Einrichtung zu initialisieren und aufzurufen.

+0

Gute Erklärung und wies mich in die richtige Richtung. Vielen Dank. – palme

Verwandte Themen