SwiftUI在执行presentationMode?.wrappedValue.dismiss()时出现随机崩溃

9

这就是崩溃的样子:

enter image description here

所以它在UIKit那一行随机崩溃。

UIKitCore
-[UIViewController _ancestorViewControllerOfClass:allowModalParent:] + 44

我在默认的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
  }
}

我这样将MyView推入导航栈:

NavigationLink(
      destination: MyView()
    ) {
      Image(systemName: "plus.circle")
        .font(.title)
    }

然后,在用户在MyView中按下按钮几秒钟后,我会在MyViewModel中调用hide()。大多数情况下它可以正常工作,但在5-10%的情况下会崩溃。


不确定您指的是哪个按钮,但实际上在我的视图模型中,我只是从后端加载数据,显示它并使用DispatchQueue.main.asyncAfter(.now + 1) { self.hide() }隐藏它。 - Paul T.
为什么不直接在视图中调用presentationMode?.wrappedValue.dismiss()?因为我决定在视图模型中隐藏视图,因为我需要在从后端得到响应后隐藏视图。 - Paul T.
“这个通过View Model进行的转移对我来说看起来很奇怪”-隐藏屏幕应该是视图模型的职责,而不是视图的职责。“如果出现视图被重新创建(由于某些父级刷新),则View Model中的绑定可能会变得悬空。”-如果视图被重新创建,则视图模型也将被重新创建,因为视图是由构建器创建的,该构建器还会构建视图模型。 - Paul T.
你需要添加 MyView().environmentObject(viewModel) 吗?似乎视图模型不会在那个初始化器中设置。 - Pranav Kasetti
有关这个问题的任何消息吗?我也遇到了这个问题@PaulT。 - zgluis
显示剩余10条评论
1个回答

1
我的解决方法是设置.navigationViewStyle(StackNavigationViewStyle())
NavigationView { content }.navigationViewStyle(StackNavigationViewStyle())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接