Подождите, пока 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 3

3 ответа:

В вашем rootViewController, когда вы rootViewController вызываете - (void)viewDidAppear:(BOOL)animated, это означает, что анимация завершена.

Вы можете кодировать в rootViewControllers - (void)viewDidAppear:(BOOL)animated

Если вы хотите кодировать в текущем ViewController, я думаю, что у него есть 2 способа:

1.добавьте delegate в rootViewController, когда вызовите - (void)viewDidAppear:(BOOL)animated use delegate для отправки сообщения

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-подкласс