Подождите, пока popToRootViewControllerAnimated:YES анимация будет выполнена
У меня есть навигация по меню. Меню-это tableView. Каждый раз, когда пользователь нажимает одну запись в этой таблице, я хочу переключиться на другой viewcontroller, и если есть какое-либо представление, я хочу сначала очистить стек навигации.
Вот что я делаю
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[(UINavigationController *)self.tabBar.selectedViewController popToRootViewControllerAnimated:YES];
self.tabBar.selectedIndex = indexPath.row;
}
Но
self.tabBar.selectedIndex = indexPath.row;
Не дайте анимации popToRoot закончиться. Есть ли способ узнать, когда анимация сделана?
Спасибо
3 ответа:
В вашем rootViewController, когда вы rootViewController вызываете
- (void)viewDidAppear:(BOOL)animated
, это означает, что анимация завершена.Вы можете кодировать в rootViewControllers
- (void)viewDidAppear:(BOOL)animated
Если вы хотите кодировать в текущем ViewController, я думаю, что у него есть 2 способа:
1.добавьте
delegate
в rootViewController, когда вызовите- (void)viewDidAppear:(BOOL)animated
usedelegate
для отправки сообщения2.добавьте уведомление в rootViewController, когда вызовите
- (void)viewDidAppear:(BOOL)animated
post уведомление . И в вашем нынешнем ViewController вы можете получить уведомление
Метод делегирования или уведомления принятого ответа работает нормально, но я нахожу этот метод более удобным, поскольку он не передает никакой логики в корневой контроллер представления, который является только средним пунктом назначения перехода.
Можно использовать основную транзакцию анимации. Таким образом, у вас есть блок завершения, который навигационный контроллер не предлагает.
Я захватываю переменную tabbarcontroller перед блоком, потому что если мы этого не сделаем, то tabbarcontroller будет равен нулю в блоке. Это не создайте любой цикл удержания, потому что блок заканчивается и исчезает
[CATransaction begin]; UITabBarController *tabController = self.navigationController.tabBarController; [CATransaction setCompletionBlock:^{ tabController.selectedIndex = 2; }]; [self.navigationController popToRootViewControllerAnimated:YES]; [CATransaction commit];
Ответ был скопирован из Joris Kluivers ответ здесь Блок завершения для popViewController и он работает идеально для меня
Никакие ответы не работали для меня, единственная идея работала для меня, чтобы отслеживать, какой контроллер и когда представлен.
Пример: https://github.com/dzenbot/iOSBlocks/blob/master/Source/UIKit/UINavigationController%2BBlock.mТа же техника, представленная в этом ответе: https://stackoverflow.com/a/20565780/1400119
единственное отличие: github-категория, answer-подкласс