使用Coordinator时,如何给视图控制器间添加自定义转场延迟?
在Coordinator模式下实现视图控制器转场延迟
要在Coordinator模式下给页面转场添加延迟,核心是将导航push操作包裹在延迟执行的代码块中,同时可以配合调整cell选中状态的时机优化交互体验,具体修改如下:
1. 修改Coordinator的导航逻辑
在ItemsCoordinator的passData方法中,使用GCD的asyncAfter实现延迟push:
class ItemsCoordinator: ItemsBaseCoordinator { func passData(i: Int) { // 设置延迟时长,示例为0.5秒,可按需调整 let delayDuration = 0.5 DispatchQueue.main.asyncAfter(deadline: .now() + delayDuration) { [weak self] in guard let self = self else { return } let vc = Items2ViewController() vc.selectedIndex = i self.navigationRootViewController?.pushViewController(vc, animated: true) } } }
2. 优化列表交互体验(可选)
在ItemsViewController的tableView(_:didSelectRowAt:)方法中,同步延迟取消cell的选中状态,让交互更自然:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { coordinator?.passData(i: indexPath.row) // 延迟取消选中,时长和转场延迟保持一致 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { tableView.deselectRow(at: indexPath, animated: true) } }
关键说明
- 用
[weak self]避免Coordinator与导航控制器之间的循环引用,保证内存安全。 - 延迟时长可根据需求调整(比如0.3-1秒),平衡交互反馈和跳转流畅度。
- 如果不需要转场动画,可将
pushViewController的animated参数设为false,不影响延迟逻辑。
内容的提问来源于stack exchange,提问作者Tom Brooke
相关产品推荐
相关产品推荐

