SwiftUI视图添加@Environment(\.presentationMode)崩溃.sheet()演示

SwiftUI视图添加@Environment(\.presentationMode)崩溃.sheet()演示,swiftui,environment,modalviewcontroller,Swiftui,Environment,Modalviewcontroller,我有一个视图,它使用.sheet()以模态方式表示另一个子视图 当此工作表被取消时,我想取消ParentView。所以有一个onDismiss回调。 但是当我补充 @Environment(\.presentationMode) var presentationMode 然后它就因为这样的错误而崩溃了 libc++abi:以NSException类型的未捕获异常终止 ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“应用程序试图显示” 模态

我有一个视图,它使用.sheet()以模态方式表示另一个子视图 当此工作表被取消时,我想取消ParentView。所以有一个onDismiss回调。 但是当我补充

@Environment(\.presentationMode) var presentationMode
然后它就因为这样的错误而崩溃了

libc++abi:以NSException类型的未捕获异常终止 ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“应用程序试图显示” 模态视图控制器 这已经由 “”以类型的未捕获异常终止 NSException CoreSimulator 757.5-设备:iPhone 12 Pro (DEE900D2-F542-496C-9000-14498B9AA407)-运行时:iOS 14.5(18E182)- 设备类型:iPhone 12 Pro

如果不使用此环境属性,一切正常。 如果此属性可用,则图纸似乎会多次尝试显示自己。 但在其他屏幕(视图)上,一切正常

*** First throw call stack:
(
    0   CoreFoundation                      0x0000000113b4ffba __exceptionPreprocess + 242
    1   libobjc.A.dylib                     0x00000001136cdff5 objc_exception_throw + 48
    2   UIKitCore                           0x0000000121df4f32 -[UIViewController _presentViewController:withAnimationController:completion:] + 6016
    3   UIKitCore                           0x0000000121df593c __63-[UIViewController _presentViewController:animated:completion:]_block_invoke + 98
    4   UIKitCore                           0x0000000121e1049c -[_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:] + 294
    5   UIKitCore                           0x0000000121e0c70e -[_UIViewControllerTransitionContext _runAlongsideCompletions] + 126
    6   UIKitCore                           0x0000000121e0c482 -[_UIViewControllerTransitionContext completeTransition:] + 106
    7   UIKitCore                           0x0000000122a2f3cc -[UITransitionView notifyDidCompleteTransition:] + 247
    8   UIKitCore                           0x0000000122a2f069 -[UITransitionView _didCompleteTransition:] + 1422
    9   UIKitCore                           0x0000000122a68e7a -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 779
    10  UIKitCore                           0x0000000122a39831 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 231
    11  UIKitCore                           0x0000000122a39dd6 -[UIViewAnimationState animationDidStop:finished:] + 263
    12  UIKitCore                           0x0000000122a39f57 -[UIViewAnimationState animationDidStop:finished:] + 648
    13  QuartzCore                          0x00000001122a8dc0 _ZN2CA5Layer23run_animation_callbacksEPv + 308
    14  libdispatch.dylib                   0x000000011ab8b74e _dispatch_client_callout + 8
    15  libdispatch.dylib                   0x000000011ab99b3f _dispatch_main_queue_callback_4CF + 1152
    16  CoreFoundation                      0x0000000113abd8f8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    17  CoreFoundation                      0x0000000113ab8169 __CFRunLoopRun + 2781
    18  CoreFoundation                      0x0000000113ab71a7 CFRunLoopRunSpecific + 567
    19  GraphicsServices                    0x0000000121151d85 GSEventRunModal + 139
    20  UIKitCore                           0x000000012251d4df -[UIApplication _run] + 912
    21  UIKitCore                           0x000000012252239c UIApplicationMain + 101
    22  SwiftUI                             0x0000000115b15c36 $s7SwiftUI17KitRendererCommon33_ACC2C5639A7D76F611E170E831FCA491LLys5NeverOyXlXpFAESpySpys4Int8VGSgGXEfU_ + 119
    23  SwiftUI                             0x0000000115b15bbd $s7SwiftUI6runAppys5NeverOxAA0D0RzlF + 143
    24  SwiftUI                             0x0000000115652384 $s7SwiftUI3AppPAAE4mainyyFZ + 61
    25  Pro                                 0x0000000104d6bf40 $s3Pro0A3AppV5$mainyyFZ + 48
    26  Pro                                 0x0000000104d6bfd4 main + 20
    27  libdyld.dylib                       0x000000011ac19bbd start + 1
示例代码如下所示

struct ParentView: View { 

@Environment(\.presentationMode) var presentationMode


    var body: some View {
      mainButton 
    .sheet(
            item: $viewModel.item,
            onDismiss: {
               
            },
            content: { summary in
               ChildView()
            }
        )

}

} 

好的,我找到了解决办法。导致问题的原因是,当存在环境(.presentationMode)时,会对此视图进行一些刷新 .sheet(项:)依赖于需要id的可识别类型。 它有这个id,但如果它使用了可选标识符

var id: String { myId ?? UUID().uuidString } 

如果没有此环境此基础模型id不会更改,但具有环境属性,则基础项模型已重新计算id,并且由于尝试两次呈现此视图而导致问题。

您不应忽略父视图,而应仅忽略工作表。它在呈现时崩溃。它尝试出现2次我只对你写的内容做出了反应。如果没有一次,就不可能帮助你解决问题。上面给出了最小的示例,但在最小的示例中它工作正常,我认为这与层次结构中的嵌套视图有关