等到popToRootViewControllerAnimated:YES动画完成

时间:2013-02-06 09:15:22

标签: ios cocoa-touch animation uinavigationcontroller

我有一个基于菜单的导航。菜单是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动画完成。有没有办法知道动画何时完成?

由于

3 个答案:

答案 0 :(得分:5)

在rootViewController中,当rootViewController调用- (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 - 类别,答案 - 子类