クラッシュはこんな感じ
そのため、UIKit ラインでランダムにクラッシュします
UIKitCore
-[UIViewController _ancestorViewControllerOfClass:allowModalParent:] + 44
デフォルトのSwiftUIナビゲーションスタックにViewがあります:
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 のボタンを押した後、hide()
MyViewModel を呼び出します。ほぼ常に動作しますが、5 ~ 10% の場合にクラッシュします。