iPhone SDK: jaka jest różnica między loadView a viewDidLoad?

Podczas pracy z widokami i kontrolerami widoków w aplikacji na iPhone, czy ktoś może wyjaśnić różnicę między loadView a viewDidLoad?

Moim osobistym kontekstem jest to, że buduję wszystkie moje poglądy z kodu, nie używam i nie będę używać kreatora interfejsów, jeśli to coś zmieni.

Zauważyłem, że często, gdy dodaję kod init do loadView, kończę z nieskończonym śladem stosu, więc zazwyczaj robię cały mój widok potomny w viewDidLoad...ale nie wiem, kiedy każdy jest wykonywany, a co jest bardziej odpowiednie miejsce do umieszczenia kodu init. To, co byłoby idealne, to prosty schemat wywołań inicjalizacyjnych.

Dzięki!

Author: Darron, 2009-02-22

7 answers

Mogę się domyślać, w czym może być problem, bo już to zrobiłem:

Zauważyłem, że często gdy dodaję kod init do loadView, kończę z nieskończonym śladem stosu

Nie czytaj siebie.widok in-loadView. only set it, don ' t get it.

Jaźń.view property accessor wywołuje - loadView, jeśli widok nie jest aktualnie ładowany. Oto twoja nieskończona rekurencja.

Zwykły sposób programowania widoku in-loadView, jak pokazano w przykładach Pre-Interface-Builder firmy Apple, jest bardziej podobny do tego:

UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];
I nie winię cię za to, że nie używasz IB. Zatrzymałem się przy tej metodzie dla wszystkich Instapaper i czuję się z nią o wiele bardziej komfortowo niż radzenie sobie ze złożonością IB, dziwactwami interfejsu i nieoczekiwanymi zachowaniami za kulisami.
 197
Author: Marco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-22 03:50:36

loadView jest to metoda w UIViewController, która faktycznie załaduje widok i przypisze go do Właściwości view. Jest to również lokalizacja, którą podklasa UIViewController nadpisałaby, jeśli chcesz programowo skonfigurować właściwość view.

viewDidLoad jest metodą, która jest wywoływana po załadowaniu widoku. Jest to wywołane po wywołaniu loadView. Jest to miejsce, w którym można zastąpić i wstawić kod, który wykonuje dalszą wstępną konfigurację widoku po załadowaniu.

 42
Author: NilObject,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-28 15:29:57
viewDidLoad()

Jest używany, gdy ładujesz widok z stalówki i chcesz wykonać dowolne dostosowanie po uruchomieniu

LoadView()

Ma być używany, gdy chcesz tworzyć swój widok programowo (bez użycia Interface Builder)

 13
Author: ashokdy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 12:54:24

Wystarczy dodać kilka przykładów kodu, aby zademonstrować, co powiedział NilObject:

- (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
Author: alamodey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-22 00:01:16

Aby zapobiec nieskończonej pętli, gdy czytasz siebie.widok, wywołaj Super implementację klasy podczas ładowania widoku. Super implementacja przydzieli Ci nowy UIView.

- (void) loadView {
[super loadview];

// init code here...

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

}
 2
Author: futureelite7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-02 06:06:55

Najprostszym sposobem użycia loadView jest stworzenie pewnego typu podstawowego kontrolera widoku, takiego jak MyBaseViewController, który jest podklasą UIViewController. W swojej metodzie loadView Utwórz widok w ten sposób:

-(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];
}

A kiedy trzeba zrobić jakiś kontroler widoku, wystarczy użyć podklasy MyBaseViewController, a w kontrolerze loadView wystarczy wywołać [super loadView] w ten sposób

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

    //rest of code like this..
    UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
    [self.view addSubview:myLabel];
    [myLabel release];
}
 1
Author: Josip B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 11:34:20

loadView() jest wywoływana, gdy kontroler zostanie poproszony o utworzenie jego self.view. Możesz to zrobić sam jak

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

Lub macierzysta Klasa uicontroller Twojego kontrolera ma już Nazwę metody -loadView(), która inicjalizuje twoje ja.widok w pusty widok. Następnie możesz zadzwonić

[super loadView];

Naprawdę polecam drugie podejście, ponieważ zachęca do dziedziczenia. Tylko wtedy, gdy kontroler widoku nie jest bezpośrednio dziedziczony z UIViewController.

 1
Author: Dulguun Otgon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 08:43:29