【问题标题】:Segue in popover dismiss completion crashing弹出窗口中的 Segue 关闭完成崩溃
【发布时间】:2020-12-23 20:59:56
【问题描述】:

我有一位客户在使用以下代码时遇到了崩溃。我们没有任何运气来复制它,并且它在已发布的应用程序中运行了多年,直到我们在 TestFlight 中分发了这个测试版:

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


【问题讨论】:

    标签: ios swift cocoa-touch uikit


    【解决方案1】:
    8 iOSense 0x10016b334 closure #5 in ODOCalGetDataViewController.catchNotification(notification:) + 200 (ODOCalGetDataViewController.swift:108)
    
    堆栈跟踪中的

    第 8 帧 显示执行是通过触发通知启动的。您能否确保在执行转场之前,负责呈现activeAlertUIViewController 实例是从Storyboard 加载的? 您可以通过添加健全性检查来确保storyboard 属性不是nil,然后再调用performSegue(withIdentifier:sender:)

    guard let _ = storyboard else { return }
    

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

    当前视图控制器必须是从情节提要中加载的。如果它的 storyboard 属性为 nil,可能是因为你自己分配和初始化了视图控制器,这个方法会抛出一个异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多