我有一个基于菜单的导航。菜单是tableView。每当用户按下该表中的一个条目时,我想切换到另一个视图控制器,如果有任何视图被推送,我想先清理导航堆栈。
这就是我正在做的事情
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[(UINavigationController *)self.tabBar.selectedViewController popToRootViewControllerAnimated:YES];
self.tabBar.selectedIndex = indexPath.row;
}
但是
self.tabBar.selectedIndex = indexPath.row;
不要让popToRoot动画完成。有没有办法知道动画何时完成?
由于
答案 0 :(得分:5)
- (void)viewDidAppear:(BOOL)animated
时,表示动画已完成。
您可以在rootViewControllers - (void)viewDidAppear:(BOOL)animated
如果你想在当前的ViewController中编写代码,我认为它有两种方式:
1.在rootViewController中添加delegate
,调用- (void)viewDidAppear:(BOOL)animated
使用delegate
发送消息
2.在调用- (void)viewDidAppear:(BOOL)animated
发布通知时,在rootViewController中添加通知。在您当前的ViewController中,您可以收到通知
答案 1 :(得分:2)
接受的答案的委托或通知方法工作正常,但我觉得这个方法比较方便,因为它没有将任何逻辑传递给根视图控制器,而根视图控制器只是转换的中间目的地。
您可以使用核心动画交易。这样您就拥有导航控制器不提供的完成块。
我在块之前捕获tabbarcontroller变量,如果我们不将tabbarcontroller在块中为nil。它不会创建任何保留周期,因为块结束并消失
[CATransaction begin];
UITabBarController *tabController = self.navigationController.tabBarController;
[CATransaction setCompletionBlock:^{
tabController.selectedIndex = 2;
}];
[self.navigationController popToRootViewControllerAnimated:YES];
[CATransaction commit];
答案是从Joris Kluivers的答案Completion block for popViewController复制而来,对我来说非常适合
答案 2 :(得分:0)
没有答案对我有用,唯一有用的想法就是跟踪哪个控制器以及何时出现 例: https://github.com/dzenbot/iOSBlocks/blob/master/Source/UIKit/UINavigationController%2BBlock.m
这个答案中提出了相同的技巧:https://stackoverflow.com/a/20565780/1400119
唯一的区别:github - 类别,答案 - 子类