如何准确检测UIViewController下拉Dismissal完成时机并执行逻辑?
UIViewController Dismiss后立即执行任务的正确实现
问题场景
需要在UIViewController被完全Dismiss后立即执行特定任务,但现有两种实现方式存在局限性:
1. viewWillDisappear的误触发问题
在viewWillDisappear中通过isBeingDismissed判断执行逻辑时,只要用户开始下拉触发Dismiss操作,isBeingDismissed就会被设为true——若用户中途取消Dismiss,不该执行的任务也会被触发,不符合需求。
代码示例:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if isBeingDismissed { // Dismissal Logic - 中途取消Dismiss时也会执行,不符合预期 } }
2. endAppearanceTransition的延迟问题
endAppearanceTransition会在Dismiss动画完成后调用,但存在约1秒的延迟,无法满足"立即执行"的要求。
代码示例:
override func endAppearanceTransition() { if isBeingDismissed { // Dismissal Logic - 动画完成约1秒后才执行,延迟过高 } super.endAppearanceTransition() }
正确解决方案
方案1:使用Dismiss方法的Completion闭包
在触发Dismiss的位置,直接调用dismiss(animated:completion:)并传入completion闭包——该闭包会在Dismiss动画完全结束、视图控制器已被移除后立即执行,且仅在Dismiss操作真正完成时触发,不会被中途取消的操作影响。
调用示例:
// 在触发Dismiss的代码位置调用 dismiss(animated: true) { // 放置需要立即执行的Dismiss完成逻辑 }
方案2:重写viewDidDisappear判断
如果需要在视图控制器内部监听Dismiss完成,可以重写viewDidDisappear并结合isBeingDismissed判断——该方法会在视图完全消失后调用,此时Dismiss操作已真正完成,不会被中途取消的操作误触发。
代码示例:
override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) if isBeingDismissed { // Dismissal Logic - 动画完成后立即执行,仅在真正Dismiss时触发 } }
内容的提问来源于stack exchange,提问作者Sundara Aadithyan
相关产品推荐
相关产品推荐

