webentwicklung-frage-antwort-db.com.de

iOS viewDidLoad für UIView

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.

57
manuelBetancurt

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.

43
borrrden

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!

7
akelec

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.
  }
}
6
fatihyildizhan

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
   }

} 

Apple Docs

6
davidrynn

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

}
2
vedrano