In einem ViewController gibt es ViewDidLoad
, um zu wissen, wann VC geladen wurde.
Welche Methode muss ich beim Laden der Ansicht für eine UIView verwenden?
Würde diese Methode mit einem Init aufgerufen?
edit: Kein XIB, nur programmatisch.
Wenn Sie es aus einer XIB-Datei laden, wird die awakeFromNib-Methode aufgerufen, wenn es aus der XIB geladen wird.
edit Wenn Sie kein XIB verwenden, müssen Sie wahrscheinlich auf eine der Methoden aus der Beobachtung schließen Ansichtsbezogene Änderungen Bereich von die Dokumente (zum Beispiel didMoveToSuperview). Besser ist es jedoch, eine Nachricht vom Ansichtscontroller in der viewDidLoad-Methode an Ihre Ansichten zu senden.
Tatsächlich müssen Sie mit der Methode viewDidLoad () des View-Controllers nichts tun, um die Initialisierung Ihrer View durchzuführen. Alles, was Sie tun möchten, können Sie in der init-Methode von view tun. In viewDidLoad () des View Controllers gibt es beispielsweise einen Initialisierungscode:
- (void)viewDidLoad{
[super viewDidLoad];
// init your parameters here
}
Analog dazu lautet die init-Methode Ihrer Ansicht:
- (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;
}
Anschließend erstellen Sie YourView über den View Controller wie folgt:
YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];
Außerdem können Sie Dinge, die Sie tun möchten, als Ihre Ansicht geladen wurde, wie folgt in die layoutSubviews-Methode Ihrer Ansicht einfügen:
-(void)layoutSubviews{
[super layoutSubviews];
// init your parameters here, like set up fonts, colors, etc...
}
Ich denke, das ist was du brauchst.
Prost!
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.
}
}
Du kannst willMove verwenden (zurÜbersicht newSuperview: UIView?)
import UIKit
final class myView: UIView {
override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
//Do stuff here
}
}
Ich hatte ein ähnliches Problem und fand eine relativ einfache Lösung. Die Idee ist, viewDidLoad zur richtigen Zeit an jede untergeordnete Ansicht zu senden und diese Methode in der Klasse Ihres Interesses zu überladen.
Fügen Sie dazu diese Teile des Codes in Ihre Klassen ein ...
// 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");
}