Почему viewDidAppear в UITabBarController исполняется до появления представления?
У меня есть 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 ответа
Если вы хотите разрешить перерисовку экрана при загрузке вашего вида, но активировать другой код обновления в -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
будет вызван в следующем цикле событий. Это хороший способ получить быстрые переходы между представлениями, если вам приходится выполнять вычислительные вычисления или обновления после загрузки представления.
Судя по всему, если вы активно вызываете метод, устройство может не успеть фактически отобразить представление, пока оно выполняет "пользовательский код" в вашем методе viewDidAppear. В этом случае вы должны позволить программе вызывать сам метод viewDidAppear.
Ваша программа также может работать с другим кодом, который может замедлить внешний вид представления, это можно решить с помощью таймеров. т.е. вместо:
[self otherCode];
вы бы написали:
[NSTimer scheduledTimerWithTimeInterval:.5
target:self
selector:@selector(otherCode)
userInfo:nil
repeats:NO];
вы можете попробовать просто отсрочить ваш "пользовательский код" с помощью таймера таким образом.