首页 > 解决方案 > SwiftUI 工作表崩溃,偶尔会出现关于修改状态的警告

问题描述

我有一个 SwiftUI 按钮,单击该按钮时sheet会显示一个确认模式。当在该模式中单击一个按钮进行确认时,我会保存到 Core Data。

我得到了一些令人讨厌的结果中的一个或全部:

显然我正在修改状态变成我正在删除一个东西,但我不清楚如何正确地做到这一点。

这是我单击删除的视图:

struct MyView: View{
  @State var showDeleteModal = false

  var body: some View{
    Button("Delete"){
      showDeleteModal.toggle()
    }
    .sheet(isPresented: self.$showDeleteModal) {
      ModalView(confirm: {
        self.showDeleteModal.toggle()
        //Save the object in my Core Data stuff
        model.saveThing(thing: thing)
      })
    }
  }
}

这是我的模式,它有一个回调函数来确认删除:

struct ModalView: View {
  var confirm:() -> Void
  
  var body: some View { 
    Button("Confirm"){
      confirm()
    }
  }
}

如何在不干扰 SwiftUI 状态的情况下隐藏模式并进行保存(从屏幕上删除视图)?

标签: macosswiftui

解决方案


我建议使用和sheet(isPresented:onDismiss:content:)调用:model.saveThingonDismiss

struct MyView: View {
    @State var showDeleteModal = false

    var body: some View {
        Button("Delete") {
            showDeleteModal.toggle()
        }
        .sheet(isPresented: self.$showDeleteModal, onDismiss: onDismiss) {
            ModalView()
        }
    }
    
    func onDismiss() {
        model.saveThing(thing: thing)
    }
}

然后您可以在不知道父母状态的情况下关闭工作表 - 只需使用@Environment(\.presentationMode)

struct ModalView: View {
    @Environment(\.presentationMode) private var presentationMode

    var body: some View {
        Button("Confirm") {
            presentationMode.wrappedValue.dismiss()
        }
    }
}

注意:由于工作表可以在不与确认按钮交互的情况下关闭,您可以使用另一个@State变量检测它是如何关闭的 - 请参阅:


推荐阅读