【问题标题】:Wait until popToRootViewControllerAnimated:YES animation is done等到 popToRootViewControllerAnimated:YES 动画完成
【发布时间】:2013-01-21 10:18:45
【问题描述】:

我有一个基于菜单的导航。菜单是一个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 动画结束。有什么方法可以知道动画何时完成?

谢谢

【问题讨论】:

    标签: ios cocoa-touch animation uinavigationcontroller


    【解决方案1】:

    没有对我有用的答案,对我有用的唯一一个想法是跟踪哪个控制器以及何时出现。
    例子: https://github.com/dzenbot/iOSBlocks/blob/master/Source/UIKit/UINavigationController%2BBlock.m

    此答案中提出的技术相同:https://stackoverflow.com/a/20565780/1400119
    唯一的区别:github - 类别,答案 - 子类

    【讨论】:

      【解决方案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 复制而来的,它对我来说非常适合

      【讨论】:

      • 这对我来说是不可预知的——当我推送一个新的视图控制器时,该块是在很久以后才执行的
      • Block 应该在 CATransaction 结束时执行,即除 rootViewController 之外的所有控制器都被弹出时。你能尝试另一个过渡吗?例如使用 [self.navigationController popViewControllerAnimated:YES];而不是 popToRootViewControllerAnimated,或者尝试不使用动画。
      • popViewControllerAnimated 效果很好,但 popToRootViewControllerAnimated 不行
      【解决方案3】:

      在您的 rootViewController 中,当您的 rootViewController 调用 - (void)viewDidAppear:(BOOL)animated 时,这意味着动画已完成。

      你可以在rootViewControllers中编码- (void)viewDidAppear:(BOOL)animated

      如果你想必须在你当前的 ViewController 中编码,我认为它有两种方式:

      1.在rootViewController中添加delegate,调用- (void)viewDidAppear:(BOOL)animated时使用delegate发送消息

      2.在rootViewController中添加通知,当调用- (void)viewDidAppear:(BOOL)animated发布通知时。在您当前的 ViewController 中,您可以收到通知

      【讨论】:

        猜你喜欢
        • 2015-07-17
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-09
        • 1970-01-01
        • 2014-07-21
        相关资源
        最近更新 更多