弹出式视窗中的Segue解雇完成当机

问题描述

我有一个客户在以下代码段上发生崩溃。我们没有运气来复制它,并且它在已发布的应用程序中运行已经好几年了,直到我们在TestFlight中分发了该Beta:

dispatchQueue.main.async(execute: {
    if let _ = self.activeAlert {
        self.activeAlert?.dismiss(animated: true,completion: {
            // crashes here
            self.performSegue(withIdentifier: "finished_calibration",sender: self)
        })
    } else {
        self.performSegue(withIdentifier: "finished_calibration",sender: self)
    }
    
})

这是堆栈跟踪


Last Exception Backtrace:
0   CoreFoundation                  0x1bde8d344 __exceptionPreprocess + 228 (NSException.m:199)
1   libobjc.A.dylib                 0x1bdba2cc0 objc_exception_throw + 60 (objc-exception.mm:565)
2   UIKitCore                       0x1c194af8c -[UIViewController performSegueWithIdentifier:sender:] + 284 (UIViewController.m:3979)
3   iOSense                         0x10016be68 partial apply for closure #1 in closure #4 in odoCalGetDataViewController.catchNotification(notification:) + 48
4   iOSense                         0x1001f24b4 thunk for @escaping @callee_guaranteed () -> () + 28 (<compiler-generated>:0)
5   UIKitCore                       0x1c195bd10 -[UIViewController dismissViewControllerWithTransition:completion:] + 1276 (UIViewController.m:7909)
6   UIKitCore                       0x1c195b720 -[UIViewController _performCoordinatedPresentOrdismiss:animated:] + 528 (UIViewController.m:7837)
7   UIKitCore                       0x1c195df68 -[UIViewController dismissViewControllerAnimated:completion:] + 148 (UIViewController.m:8335)
8   iOSense                         0x10016b334 closure #5 in odoCalGetDataViewController.catchNotification(notification:) + 200 (odoCalGetDataViewController.swift:108)
9   iOSense                         0x1001f24b4 thunk for @escaping @callee_guaranteed () -> () + 28 (<compiler-generated>:0)
10  libdispatch.dylib               0x1bdb2e134 _dispatch_call_block_and_release + 32 (init.c:1408)
11  libdispatch.dylib               0x1bdb2f5ac _dispatch_client_callout + 20 (object.m:495)
12  libdispatch.dylib               0x1bdb3b7d4 _dispatch_main_queue_callback_4CF + 832 (inline_internal.h:2484)
13  CoreFoundation                  0x1bde088d4 __CFRUNLOOP_IS_SERVICING_THE_MAIN_disPATCH_QUEUE__ + 16 (CFRunLoop.c:1749)
14  CoreFoundation                  0x1bde0358c __CFRunLoopRun + 1692 (CFRunLoop.c:3069)
15  CoreFoundation                  0x1bde02bc8 CFRunLoopRunSpecific + 480 (CFRunLoop.c:3192)
16  GraphicsServices                0x1c81eb5cc GSEventRunModal + 164 (GSEvent.c:2246)
17  UIKitCore                       0x1c1fb5744 UIApplicationMain + 1936 (UIApplication.m:4823)
18  iOSense                         0x100120114 main + 68 (ISenseApplication.swift:13)
19  libdyld.dylib                   0x1bdc7f384 start + 4


解决方法

8 iOSense 0x10016b334 closure #5 in ODOCalGetDataViewController.catchNotification(notification:) + 200 (ODOCalGetDataViewController.swift:108)
堆栈跟踪中的

框架8 显示执行是通过触发通知启动的。您能否确定在执行segue之前已从UIViewController加载了负责呈现activeAlert的{​​{1}}实例? 为此,您可以在调用Storyboard之前添加健全性检查以确保storyboard属性不是nil

performSegue(withIdentifier:sender:)

performSegue(withIdentifier:sender:)的Apple文档说

当前视图控制器必须已从情节提要中加载。如果它的故事板属性为nil,则可能是因为您自己分配并初始化了视图控制器,所以此方法将引发异常。