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

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加自定义回调:

  1. 先在AddViewModel中新增回调属性
class AddViewModel: ObservableObject {
    @Binding var showAddView: Bool
    // 新增完成回调
    var onOperationSuccess: (() -> Void)?
    
    init(showAddView: Binding<Bool>) {
        self._showAddView = showAddView
    }
    
    // 你原来的业务逻辑方法,比如提交保存
    func save() {
        // 原有业务逻辑执行完成后
        onOperationSuccess?() // 触发回调
        showAddView = false // 关闭sheet
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:36:03