崩溃日志表明应用程序在我的应用程序中不存在的 UIPopoverPresentationController 方法上崩溃

Crash logs indicated app crashes on UIPopoverPresentationController method not present in my app

我收到的崩溃日志显示我的应用程序在 [UIPopoverPresentationController presentationTransitionWillBegin] 崩溃,但我的代码中没有任何地方使用 UIPopoverPresentationController。这些都在 iPad 上,我使用了一个 UIDocumentInteractionController,它看起来很相似,也许它是 UIPopoverPresentationController 的子类,我不知道。知道是什么原因造成的吗?

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x184799900 __exceptionPreprocess + 124 (NSException.m:162)
1   libobjc.A.dylib                 0x183e07f80 objc_exception_throw + 56 (objc-exception.mm:531)
2   UIKit                           0x189db43a0 -[UIPopoverPresentationController presentationTransitionWillBegin] + 2884 (UIPopoverPresentationController.m:1197)
3   UIKit                           0x1897e82fc __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke + 1640 (UIPresentationController.m:1136)
4   UIKit                           0x1897e6414 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 332 (UIPresentationController.m:704)
5   UIKit                           0x18973cb70 _runAfterCACommitDeferredBlocks + 292 (UIApplication.m:2312)
6   UIKit                           0x18974a030 _cleanUpAfterCAFlushAndRunDeferredBlocks + 92 (UIApplication.m:2290)
7   UIKit                           0x18947dc24 _afterCACommitHandler + 96 (UIApplication.m:2342)
8   CoreFoundation                  0x184750588 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 (CFRunLoop.c:1620)
9   CoreFoundation                  0x18474e32c __CFRunLoopDoObservers + 372 (CFRunLoop.c:1716)
10  CoreFoundation                  0x18474e75c __CFRunLoopRun + 928 (CFRunLoop.c:2558)
11  CoreFoundation                  0x18467d680 CFRunLoopRunSpecific + 384 (CFRunLoop.c:2814)
12  GraphicsServices                0x185b8c088 GSEventRunModal + 180 (GSEvent.c:2245)
13  UIKit                           0x1894f4d90 UIApplicationMain + 204 (UIApplication.m:3681)
14  MyCoolApp                       0x100083564 0x10007c000 + 30052
15  libdyld.dylib                   0x18421e8b8 start + 4 (start_glue.s:80)

所以问题最终是我的 UIAlertController 以错误的方式呈现。这是导致崩溃的原因。

UIAlertController *alert = [UIAlertController alertControllerWithTitle:NULL message:NULL preferredStyle:UIAlertControllerStyleActionSheet];
[alert addAction:[UIAlertAction actionWithTitle:copyKey style:UIAlertActionStyleDefault handler:alerAction]];
[alert addAction:[UIAlertAction actionWithTitle:shareKey style:UIAlertActionStyleDefault handler:alerAction]];
[alert addAction:[UIAlertAction actionWithTitle:cancelKey style:UIAlertActionStyleCancel handler:alerAction]];

//THIS LINE CRASHED IT
[self presentViewController:alert animated:1 completion:NULL];

我只是没有对 iPad 进行足够的测试,当我在插入调试器的情况下尝试这个时,它崩溃了,并给了我一个冗长的有用消息,这里是摘录 "You must provide location information for this popover through the alert controller's popoverPresentationController"。所以这就是我现在展示它的方式并且它有效。

[alert setModalPresentationStyle:UIModalPresentationPopover];

UIPopoverPresentationController *popPresenter = [alert popoverPresentationController];
popPresenter.sourceView = self.view;
popPresenter.sourceRect = alertSourceRect;
[self presentViewController:alert animated:YES completion:nil];