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中完成提交操作才需要刷新,主动点取消关闭不需要刷新,可以给弹窗页自定义回调参数:
- 首先修改
AddView的定义,新增回调属性:
struct AddView: View { // 原有属性保留 let viewModel: AddViewModel let accessibilityID: String // 新增操作完成回调 var onSuccess: (() -> Void)? // 提交按钮点击逻辑中调用回调 func submitHandler() { // 原有提交保存逻辑 viewModel.saveData() // 通知主视图操作成功 onSuccess?() // 关闭弹窗 viewModel.showAddPassengerView.wrappedValue = false } // ... 其他视图代码 }
- 主视图初始化
AddView时传入回调:
.sheet(isPresented: $showView) { AddView( viewModel: AddViewModel(accessibilityID: accessibilityID, showAddPassengerView: $showView), accessibilityID: accessibilityID, onSuccess: { // 仅操作成功时执行刷新逻辑 reloadMainViewData() } ) }
内容的提问来源于stack exchange,提问作者New iOS Dev
相关产品推荐
相关产品推荐

