【问题标题】:Checking for completed nav controller animation检查完成的导航控制器动画
【发布时间】:2012-03-14 18:03:54
【问题描述】:

我现在知道,如果您将视图控制器推送到带有动画的导航控制器上,您必须等到该动画完成后再推送另一个视图控制器,否则您会收到警告并可能出现意外结果。

如何检查导航控制器动画是否已完成以避免此问题?

谢谢

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:    (NSIndexPath *)indexPath
{ 
    // ...


    //Make sure animation has completed before sending message below


[[self navigationController] pushViewController:detailsViewController animated:NO];

//...

}

【问题讨论】:

    标签: uitableview ios5 pushviewcontroller nsindexpath


    【解决方案1】:

    如果您想一次推动一个 VC(在许多 VC 上向右移动很好),您可以在控制器类中实现 UINavigationControllerDelegate(应用程序委托会这样做),将它/您自己分配给 self.navigationController.delegate . UINavigationController 会在每次推送后调用navigationController:didShowViewController:animated:

    【讨论】:

      【解决方案2】:

      我使用了一种对我来说效果很好的替代方法。只需将pushViewController:animated: 调用包装在[UIView animateWithDuration:animation:completionanimations: 参数中。将您需要在完成时运行的任何内容,例如推送我正在做的后续控制器,在completion: 中。

      在我的例子中,我在一个方法中运行整个事情,该方法将一个数组 (NSMutableArray) 与要推送的控制器列表作为参数。在completion: 块中,该方法从数组中弹出第一个元素(objectAtIndex:0removeObjectAtIndex:0)并使用数组的其余部分调用自身。

      这是一个有趣的continuation-passing-style 实现:) 不过需要注意的一点是,在动画结束时,新导航控制器的内容可能未完全加载,因此只有在您的推送独立于该内容时,此方法才可靠。

      【讨论】:

      • 在 iOS 7 上,完成块在动画完成之前执行。
      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      相关资源
      最近更新 更多