求UIKit中带completion回调的popViewController有效方案及官方未提供原因
UIKit 中带 Completion 回调的 popViewController 实现方案
可行的当前实现(iOS 13+ 适配)
针对iOS 13及以上版本,结合transitionCoordinator的交互状态监听,以下是可靠的实现:
extension UINavigationController { func popViewController(animated: Bool, completion: @escaping () -> Void) { popViewController(animated: animated) guard animated, let coordinator = transitionCoordinator else { completion() return } // 监听转场完成 coordinator.animate(alongsideTransition: nil) { _ in completion() } // 处理滑动返回中途取消的场景 coordinator.notifyWhenInteractionEnds { context in if context.isCancelled { completion() } } } }
旧方案失效原因
你提供的两种旧方案在新版本iOS中失效的核心原因:
- 第一种方案:未处理滑动返回交互被取消的场景,当用户中途取消滑动返回时,原逻辑不会触发completion,导致回调丢失。
- 第二种CATransaction方案:iOS 13之后系统导航转场的动画不再完全依赖当前CATransaction上下文,导致completionBlock无法准确对应转场结束时机,可能提前或延后触发。
关于官方未提供该功能的疑问
UIKit官方不直接提供带completion的popViewController,主要有两点原因:
- API设计简洁性:导航转场存在多种分支场景(比如交互取消、非动画转场),直接在API中嵌入completion会增加接口复杂度,官方更倾向于通过
transitionCoordinator让开发者自主处理转场状态。 - 转场逻辑的灵活性:
transitionCoordinator提供了更全面的转场监听能力,开发者可以根据需求监听转场的各个阶段,而非仅依赖单一的结束回调。
内容的提问来源于stack exchange,提问作者Yotam
相关产品推荐
相关产品推荐

