![](/img/trans.png)
[英]SwiftUI presentationMode: Check if view is presented by sheet
[英]SwiftUI View adding @Environment(\.presentationMode) crashes .sheet() presentation
我有視圖 uses.sheet() 以模態方式呈現一些我想在關閉此工作表時關閉 ParentView 的 ChildView。 所以有 onDismiss 回調。 但是,當我添加
@Environment(\.presentationMode) var presentationMode
然后提交工作表它會因此類錯誤而崩潰
libc++abi: terminating with uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally a view controller < TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView : 0x7ffc07175c60> that is already being presented by < TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier _ :0x7ffc04438c00>。' 以 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()
}
)
}
}
好的,我找到了解決方案。 導致問題的原因是,當有Environment(.presentationMode)時,對此視圖進行了一些刷新。sheet(item:) 依賴於需要 id 的 Identifiable 類型。 它有這個 id,但如果它使用帶有 like 的可選標識符
var id: String { myId ?? UUID().uuidString }
當沒有這個環境時,這個底層 model id 不會改變,但是環境屬性底層項目 model 已經重新計算了 id,它通過嘗試兩次呈現這個視圖而導致問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.