SwiftUI中sheet关闭时如何调用另一个viewModel的方法?
解决方案
方案1:使用sheet自带的onDismiss回调(通用场景,只要sheet关闭就触发)
这是最简单的实现方式,sheet modifier本身提供了onDismiss参数,会在sheet完全关闭后自动执行你传入的闭包,不管是用户手动下滑关闭,还是你在AddView里主动修改showAddView关闭都会触发:
// 假设FirstView中持有FirstViewModel的实例名为firstViewModel .sheet(isPresented: $showAddView, onDismiss: { firstViewModel.update() }) { AddView(viewModel: AddViewModel(showAddView: $showAddView)) }
方案2:自定义回调闭包(仅在AddView完成指定操作后才触发)
如果你不需要所有关闭场景都调用update,只有当AddView完成业务逻辑(比如提交保存成功)时才需要触发,就可以给AddViewModel加自定义回调:
- 先在AddViewModel中新增回调属性
class AddViewModel: ObservableObject { @Binding var showAddView: Bool // 新增完成回调 var onOperationSuccess: (() -> Void)? init(showAddView: Binding<Bool>) { self._showAddView = showAddView } // 你原来的业务逻辑方法,比如提交保存 func save() { // 原有业务逻辑执行完成后 onOperationSuccess?() // 触发回调 showAddView = false // 关闭sheet } }
- 在FirstView中给AddViewModel的回调赋值
.sheet(isPresented: $showAddView) { let addVM = AddViewModel(showAddView: $showAddView) // 注意加[weak firstViewModel]避免循环引用 addVM.onOperationSuccess = { [weak firstViewModel] in firstViewModel?.update() } AddView(viewModel: addVM) }
内容的提问来源于stack exchange,提问作者New iOS Dev
相关产品推荐
相关产品推荐

