SwiftUI 在presentationMode?.wrappedValue.dismiss() 上随机崩溃

Pau*_* T. 9 presentation-model uinavigationcontroller swift swiftui environmentobject

这就是崩溃的样子

在此处输入图片说明

所以它在 UIKit 线上随机崩溃

UIKitCore
-[UIViewController _ancestorViewControllerOfClass:allowModalParent:] + 44
Run Code Online (Sandbox Code Playgroud)

我在默认的 SwiftUI 导航堆栈中有视图:

struct MyView: View {
  @EnvironmentObject var viewModel: MyViewModel
  @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

var body: some View {
    ZStack {
      ......
    }
    .onAppear {
      self.viewModel
        .onViewAppear(presentationMode: self.presentationMode)
    }
  }
}

final class MyViewModel {
  var presentationMode: Binding<PresentationMode>?

  func onViewAppear(presentationMode: Binding<PresentationMode>) {
    self.presentationMode = presentationMode
  }

  func hide() {
    presentationMode?.wrappedValue.dismiss() // crashes after calling this
  }
}
Run Code Online (Sandbox Code Playgroud)

所以我以这种方式将 MyView 推送到导航堆栈中:

NavigationLink(
      destination: MyView()
    ) {
      Image(systemName: "plus.circle")
        .font(.title)
    }
Run Code Online (Sandbox Code Playgroud)

然后在用户在几秒钟后按下 MyView 中的按钮后,我调用hide()MyViewModel。几乎所有时间它都可以工作,但在 5-10% 的情况下它会崩溃。

dru*_*_sf 1

对我来说修复是设置.navigationViewStyle(StackNavigationViewStyle())

NavigationView { content }.navigationViewStyle(StackNavigationViewStyle())

Run Code Online (Sandbox Code Playgroud)