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!
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.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.
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)
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];
}
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..
}
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];
}
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.
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