We are seeing crashes only on iOS 14 (and its sub-releases) that we are unable to reproduce locally with the following stack trace:
Fatal Exception: NSGenericException
UIPopoverPresentationController (<UIPopoverPresentationController: 0x112513b50>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.
Last Exception Backtrace:
0 CoreFoundation 0x1a36eb9d8 __exceptionPreprocess + 216 (NSException.m:199)
1 libobjc.A.dylib 0x1b7a6eb54 objc_exception_throw + 56 (objc-exception.mm:565)
2 UIKitCore 0x1a577eba4 -[UIPopoverPresentationController presentationTransitionWillBegin] + 3908 (UIPopoverPresentationController.m:1326)
3 UIKitCore 0x1a578a1fc __80-[UIPresentationController _initViewHierarchyForPresentationSuperview:inWindow:]_block_invoke + 2392 (UIPresentationController.m:1574)
4 UIKitCore 0x1a5787cd8 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke.466 + 532 (UIPresentationController.m:1079)
5 UIKitCore 0x1a63fff08 -[_UIAfterCACommitBlock run] + 64 (_UIAfterCACommitQueue.m:122)
6 UIKitCore 0x1a5f65984 _runAfterCACommitDeferredBlocks + 296 (UIApplication.m:2920)
7 UIKitCore 0x1a5f54eb4 _cleanUpAfterCAFlushAndRunDeferredBlocks + 200 (UIApplication.m:2898)
8 UIKitCore 0x1a5f86484 _afterCACommitHandler + 76 (UIApplication.m:2954)
9 CoreFoundation 0x1a366a87c __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 (CFRunLoop.c:1799)
10 CoreFoundation 0x1a3664f50 __CFRunLoopDoObservers + 604 (CFRunLoop.c:1912)
11 CoreFoundation 0x1a3665498 __CFRunLoopRun + 960 (CFRunLoop.c:2953)
12 CoreFoundation 0x1a3664ba0 CFRunLoopRunSpecific + 572 (CFRunLoop.c:3242)
13 GraphicsServices 0x1ba3ca598 GSEventRunModal + 160 (GSEvent.c:2259)
14 UIKitCore 0x1a5f562f4 -[UIApplication _run] + 1052 (UIApplication.m:3253)
15 UIKitCore 0x1a5f5b874 UIApplicationMain + 164 (UIApplication.m:4707)
16 libswiftUIKit.dylib 0x1b6de2b54 UIApplicationMain(_:_:_:_:) + 100 (UIKit.swift:528)
17 IXLMath 0x1049da44c main + 58444 (<compiler-generated>:0)
18 libdyld.dylib 0x1a3343568 start + 4
We only set modalPresentationStyle = .popover
with this method in our UIViewController
extension
@discardableResult
func setUpPopoverPresentation(sourceView: UIView, sourceRect: CGRect)
-> UIPopoverPresentationController {
modalPresentationStyle = .popover
popoverPresentationController!.sourceView = sourceView
popoverPresentationController!.sourceRect = sourceRect
return popoverPresentationController!
}
We sometimes pass a force unwrapped optional, e.g., @IBOutlet weak var borderLabel: UILabel!,
as sourceView, but we don't expect this value to be nil and believe we would see other issues if it were nil.
Are there any requirements for the sourceView
or sourceRect
we use for the popoverPresentationController
besides being non-nil? Can sourceView
be a force unwrapped optional as long as it is not nil? Can sourceRect
have a 0 height and 0 width?
Is there potentially an iOS 14 bug related to this?
Could bad memory be manifesting itself with this exception?
Does anyone have other ideas about the cause of this issue or suggestions for fixing it?
We have already looked at Apple documentation for UIPopoverPresentationController and popoverPresentationController and have not been able to find answers.
Thank you!