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

SwiftUI中sheet弹窗关闭后如何刷新上一级视图?

实现方案

下面提供三种适配不同场景的实现方式:

方式1:使用sheet自带的onDismiss回调(推荐,iOS 15+支持)

sheet修饰符本身提供了关闭完成的回调参数,sheet 完全关闭后会自动执行该闭包,所有关闭场景都会触发,适合无论用户是提交操作还是点取消关闭都需要刷新的场景:

.sheet(isPresented: $showView, onDismiss: {
    // 此处写入主视图刷新逻辑,例如重新请求数据、刷新状态变量等
    reloadMainViewData()
}) {
    AddView(viewModel: AddViewModel(accessibilityID: accessibilityID,
                                    showAddPassengerView: $showView),
            accessibilityID: accessibilityID)
}

方式2:监听showView状态变化(兼容iOS 14及更低版本)

如果需要适配旧版本系统,可以通过onChange监听弹窗控制变量的状态,当变量从true变为false时执行刷新逻辑:

// 和 sheet 修饰符同级添加该监听逻辑
.onChange(of: showView) { isShowing in
    if !isShowing {
        // 执行刷新逻辑
        reloadMainViewData()
    }
}

方式3:自定义完成回调(仅操作成功才需要刷新的场景)

如果只有用户在sheet中完成提交操作才需要刷新,主动点取消关闭不需要刷新,可以给弹窗页自定义回调参数:

  1. 首先修改AddView的定义,新增回调属性:
struct AddView: View {
    // 原有属性保留
    let viewModel: AddViewModel
    let accessibilityID: String
    // 新增操作完成回调
    var onSuccess: (() -> Void)?

    // 提交按钮点击逻辑中调用回调
    func submitHandler() {
        // 原有提交保存逻辑
        viewModel.saveData()
        // 通知主视图操作成功
        onSuccess?()
        // 关闭弹窗
        viewModel.showAddPassengerView.wrappedValue = false
    }

    // ... 其他视图代码
}
  1. 主视图初始化AddView时传入回调:
.sheet(isPresented: $showView) {
    AddView(
        viewModel: AddViewModel(accessibilityID: accessibilityID, showAddPassengerView: $showView),
        accessibilityID: accessibilityID,
        onSuccess: {
            // 仅操作成功时执行刷新逻辑
            reloadMainViewData()
        }
    )
}

内容的提问来源于stack exchange,提问作者New iOS Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:12:02