Почему viewDidAppear в UITabBarController выполняется до появления представления? - PullRequest
3 голосов
/ 28 ноября 2010

У меня есть UITabBarController, который вкладывает подкласс UIView (ImageViewer) в качестве третьей вкладки.

В этом подклассе ImageViewer я вызываю метод viewDidAppear:

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    /* ... start custom code ... 
    NSLog(@"viewDidAppear tag 1 passed);          /* BREAKPOINT 1 here

    [myUIActivityIndicator stopAnimating];

    NSLog(@"viewDidAppear tag 2 passed);          /* BREAKPOINT 2 here
    /* ... end custom code ... 
}

метод вызывается автоматически, но, как ни странно, представление появляется только после полной обработки этого метода?

Когда я устанавливаю контрольные точки (1 и 2), как указано, обработка (после выбора вкладки) останавливается, пока предыдущая вкладка все еще отображается. Только при нажатии продолжить после второй точки останова будет отображаться представление. (К вашему сведению NSLogs проводятся без промедления).

В этом случае viewDidAppear ведет себя больше как viewWillAppear ....

Есть какие-нибудь подсказки, что может происходить?

Приветствия

Ответы [ 2 ]

10 голосов
/ 29 ноября 2010

Если вы хотите разрешить перерисовку экрана при загрузке вашего вида, но для запуска какого-либо другого кода обновления в -viewDidAppear:, используйте performSelector:withObject:afterDelay:, например:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self performSelector:@selector(updateUI) withObject:nil afterDelay:0.0];
}

…

- (void)updateUI
{
    // Do your UI stuff here
}

Когда вы сделаете это таким образом, текущий цикл событий быстро завершится, и UIKit сможет перерисовать экран после загрузки вашего представления. updateUI будет вызываться в цикле событий next . Это хороший способ получить быстрые переходы представления, если вам приходится выполнять вычислительные вычисления или обновления после загрузки представления.

0 голосов
/ 28 ноября 2010

Судя по звуку, если вы активно вызываете метод, устройство может не успеть фактически отобразить представление, пока оно выполняет «пользовательский код» в вашем методе viewDidAppear.В этом случае вам следует разрешить программе вызывать сам метод viewDidAppear.

Ваша программа может также работать с другим кодом, который может замедлить появление представления, это можно решить с помощью таймеров.т. е. вместо:

[self otherCode];

вы бы написали:

[NSTimer scheduledTimerWithTimeInterval:.5 
    target:self 
    selector:@selector(otherCode) 
    userInfo:nil 
    repeats:NO];

, возможно, вы захотите попытаться просто отсрочить свой «код пользователя» с помощью таймера таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...