UIViewController viewDidLoad вызывается до завершения метода init - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть контроллер представления, который инициализирует два других контроллера представления. Представление для одного контроллера не показывалось, и я отследил проблему, когда экземпляр был добавлен в супер-представление.

Вот код. viewDidLoad вызывается до инициализации FavoritesTableVC. Это можно увидеть, разместив точки останова в методах инициализации контроллеров представления результатов resultsTableVC и FavoritesTableVC.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        resultsTableVC = [[[ResultsTableVC alloc] initWithController:self andTableView:nil] retain];
        favoritesTableVC = [[[FavoritesTableVC alloc] initWithFrame:CGRectMake(0, 10, self.view.frame.size.width, defaultFavoritesTableHeight) andController:self] retain];        
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view addSubview:resultsTableVC.view];
    [resultsTableVC release];
    [self.view addSubview:favoritesTableVC.view];
    [favoritesTableVC release];    
}

Вот порядок вызова методов:

  • allResults init
  • resultsTableVC init
  • allResults viewDidLoad
    • addSubview allResultsVC
    • добавитьПоделиться в избранномРезультатыVC
  • избранноеРезультатыVC init

Это один поток, поэтому я не понимаю, как viewDidLoad может быть вызван до завершения init.

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

- [ResultsTableVC initWithController: andTableView:], вероятно, ссылается на allResults.view.

Это заставит контроллер allResults загрузить свое представление (что, конечно, вызывает срабатывание viewDidLoad).Все это происходит синхронно, прежде чем вы действительно вернетесь из initWithController: andTableView:

0 голосов
/ 11 декабря 2011

Я предполагаю, но не могли бы вы попробовать это:

favoritesTableVC = [[[FavoritesTableVC alloc] initWithFrame:CGRectMake(0, 10, SOME_HARD_CODED_INT, SOME_HARD_CODED_INT) andController:self] retain]; 

И посмотрите, получите ли вы тот же результат.
Я предполагаю, что self.view указывает на nilв то время.
Но это не объясняет, почему init вызывается после ... но безуспешно при попытке.
(я не проверял)

...