I am receiving crash logs that say that my app is crashing on [UIPopoverPresentationController presentationTransitionWillBegin]
, but nowhere in my code do I use a UIPopoverPresentationController. The've all been on iPads, I use a UIDocumentInteractionController which seems similar, maybe It's a subclass of UIPopoverPresentationController, I don't know. Any idea what could be causing this?
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)
So the problem ended up being that I had a UIAlertController that I was presenting the wrong way. Here's what caused the crash.
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];
I just hadn't done adequate testing on the iPad, When the I tried this with the debugger plugged in it crashed and gave me a lengthy useful message, here's an excerpt "You must provide location information for this popover through the alert controller's popoverPresentationController". So this is how I present it now and It works.
[alert setModalPresentationStyle:UIModalPresentationPopover];
UIPopoverPresentationController *popPresenter = [alert popoverPresentationController];
popPresenter.sourceView = self.view;
popPresenter.sourceRect = alertSourceRect;
[self presentViewController:alert animated:YES completion:nil];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With