You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何准确检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:26:02