webentwicklung-frage-antwort-db.com.de

iPhone SDK: Was ist der Unterschied zwischen loadView und viewDidLoad?

Kann jemand beim Arbeiten mit Ansichten und Ansichtscontrollern in einer iPhone-App den Unterschied zwischen loadView und viewDidLoad erklären?

Mein persönlicher Kontext ist, dass ich alle meine Ansichten aus Code erstelle. Ich benutze und benutze den Interface Builder nicht, sollte das einen Unterschied machen.

Ich habe festgestellt, dass ich beim Hinzufügen von Init-Code zu loadView häufig einen unendlichen Stack-Trace erhalte, sodass ich normalerweise alle untergeordneten Ansichten in viewDidLoad erstelle ... aber es ist mir wirklich unklar, wann jede ausgeführt wird, und Was ist der geeignetere Ort, um Init-Code zu setzen. Was perfekt wäre, ist ein einfaches Diagramm der Initialisierungsaufrufe.

Vielen Dank!

135
ryan.scott

Ich kann mir vorstellen, was hier das Problem sein könnte, weil ich es getan habe:

Ich habe festgestellt, dass ich beim Hinzufügen von Init-Code zu loadView häufig eine unendliche Stapelablaufverfolgung erhalte

Lies nicht self.view in -loadView. Nur setze es, nicht es bekommen .

Der self.view-Eigenschafts-Accessor ruft -loadView auf, wenn die Ansicht derzeit nicht geladen ist. Es gibt deine unendliche Rekursion.

Der übliche Weg, die Ansicht programmgesteuert in -loadView zu erstellen, wie in den Beispielen von Apple vor dem Interface-Builder gezeigt, sieht folgendermaßen aus:

UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];

Und ich beschuldige Sie nicht, IB nicht verwendet zu haben. Ich habe mich für alle Instapaper-Anwender an diese Methode gehalten und bin damit viel zufriedener als mit den Komplexitäten, den Macken der Benutzeroberfläche und dem unerwarteten Verhalten hinter den Kulissen von IB.

199
Marco

loadView ist die Methode in UIViewController, mit der die Ansicht tatsächlich geladen und der Eigenschaft view zugewiesen wird. Dies ist auch der Speicherort, den eine Unterklasse von UIViewController überschreiben würde, wenn Sie die Eigenschaft view programmgesteuert einrichten möchten.

viewDidLoad ist die Methode, die aufgerufen wird, sobald die Ansicht geladen wurde. Dies wird aufgerufen, nachdem loadView aufgerufen wurde. Hier können Sie Code überschreiben und einfügen, um die Ansicht nach dem Laden weiter einzurichten.

44
NilObject
viewDidLoad()

wird verwendet, wenn Sie Ihre Ansicht von einer NIB laden und nach dem Start Anpassungen vornehmen möchten

LoadView()

wird verwendet, wenn Sie Ihre Ansicht programmgesteuert erstellen möchten (ohne Verwendung von Interface Builder)

13
ashokdy

Fügen Sie einfach einige Codebeispiele hinzu, um zu demonstrieren, was NilObject gesagt hat:

- (void)loadView
{
    // create and configure the table view
    myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped];   
    myTableView.delegate = self;
    myTableView.dataSource = self;
    myTableView.scrollEnabled = NO;
    self.view = myTableView;

    self.view.autoresizesSubviews = YES;
}

- (void)viewDidLoad 
{
  self.title = @"Create group";

  // Right menu bar button is to Save
  UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)];
  self.navigationItem.rightBarButtonItem = saveButtonItem;
  [saveButtonItem release];
}
11
alamodey

Rufen Sie beim Laden einer Sicht die Super-Implementierung der Klasse auf, um zu verhindern, dass beim Lesen von self.view eine Endlosschleife auftritt. Die Super-Implementierung wird Ihnen ein neues UIView zuweisen.

- (void) loadView {
[super loadview];

// init code here...

[self.view addSubView:mySubview1]; //etc..

}
2
futureelite7

loadView() wird aufgerufen, wenn Ihr Controller aufgefordert wird, seinen self.view zu erstellen. Du kannst es selbst machen wie

self.view = [UIView alloc] init...];

Oder die übergeordnete UIController-Klasse Ihres Controllers hat bereits einen Methodennamen -loadView(), der Ihre self.view in eine leere Ansicht initialisiert. Dann kannst du anrufen

[super loadView];

Ich kann den zweiten Ansatz nur empfehlen, da er die Vererbung fördert. Nur wenn Ihr View Controller nicht direkt von UIViewController geerbt wird.

1
Dulguun Otgon

Die einfachste Möglichkeit, loadView zu verwenden, besteht darin, eine Art Basisansicht-Controller zu erstellen, z. B. MyBaseViewController, eine Unterklasse von UIViewController. In der loadView-Methode erstellen Sie die Ansicht folgendermaßen:

-(void) loadView {
    if ([self viewFromNib]) {
        self.view = [self viewFromNib];
    } else {
        self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    }
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor whiteColor];
}

Und wenn Sie einen View-Controller erstellen müssen, verwenden Sie einfach eine Unterklasse von MyBaseViewController. In diesem LoadView-Controller rufen Sie einfach [super loadView] wie folgt auf

//sucblass loadView
-(void) loadView {
    [super loadView];

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}
1
Josip B.

In der Definition von Apple on viewDidLoad wurde erwähnt, dass es aufgerufen wird, nachdem die Ansicht des Controllers in den Speicher geladen wurde. Einfach ausgedrückt, es ist die erste Methode, die geladen wird.

Sie überlegen sich vielleicht, unter welchen Bedingungen diese Methode voll ausgenutzt wird? Die Antwort ist, im Grunde genommen, was immer Sie wollten, dass die App zuerst geladen wird. Zum Beispiel möchten Sie vielleicht eine andere Hintergrundfarbe anstelle von Weiß, Sie könnten vielleicht Blau wählen.

0