等待popToRootViewControllerAnimated:YES动画完成

3
我是一个基于菜单的导航。该菜单是一个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个回答

5

在你的根视图控制器中,当你的根视图控制器调用- (void)viewDidAppear:(BOOL)animated时,这意味着动画已经完成。

你可以在根视图控制器中编写- (void)viewDidAppear:(BOOL)animated方法。

如果你必须在当前的视图控制器中编写代码,我认为有两种方法:

1.在根视图控制器中添加一个代理,在调用- (void)viewDidAppear:(BOOL)animated时使用代理发送消息。

2.在根视图控制器中添加一个通知,在调用- (void)viewDidAppear:(BOOL)animated时发布通知。在你的当前视图控制器中,你可以接收到这个通知。


2

接受答案的委托或通知方法可以正常工作,但我发现这种方法更方便,因为它不会将任何逻辑传递给根视图控制器,后者只是转换的中间目的地。

您可以使用核心动画事务。这样,您就有了导航控制器没有提供的完成块。

我在块之前捕获了tabbarcontroller变量,因为如果我们不这样做,在块中tabbarcontroller将为空。这并不会创建任何保留循环,因为块结束并消失。

[CATransaction begin];
UITabBarController *tabController = self.navigationController.tabBarController;
[CATransaction setCompletionBlock:^{
    tabController.selectedIndex = 2;
}];

[self.navigationController popToRootViewControllerAnimated:YES];

[CATransaction commit];

答案来自Joris Kluivers在这里的回答Completion block for popViewController,对于我来说它非常完美地工作。


1
对我来说这是出乎意料的 - 当我推入一个新的视图控制器时,该块执行得更晚 - diachedelic
当CATransaction结束并且除了rootViewController之外的所有控制器都被弹出时,块应该被执行。你可以尝试使用另一种转换方式吗?例如,使用[self.navigationController popViewControllerAnimated:YES];而不是popToRootViewControllerAnimated,或者尝试不使用动画。 - buttcmd
popViewControllerAnimated很好用,但popToRootViewControllerAnimated不行。 - CyberMew

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接