Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SwiftUI Share Sheet Crashes iPad

I was following this tutorial https://jeevatamil.medium.com/how-to-create-share-sheet-uiactivityviewcontroller-in-swiftui-cef64b26f073

to add a simple share sheet to my swiftui app. It works properly on iPhones but crashes on iPad with this error

Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<UIPopoverPresentationController: 0x107d95ee0>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.'

Any way to get around this error? Not exactly sure what's happening here. Thanks!

like image 856
Boeggles Avatar asked Apr 13 '21 16:04

Boeggles


1 Answers

You just need to set sourceView and sourceRect on the UIActivityViewController's popoverPresentationController. Here's a more complete and correct example than I've seen so far:

// Get a scene that's showing (iPad can have many instances of the same app, some in the background)
let activeScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
        
let rootViewController = (activeScene?.windows ?? []).first(where: { $0.isKeyWindow })?.rootViewController
        
// iPad stuff (fine to leave this in for all iOS devices, it will be effectively ignored when not needed)
activityVC.popoverPresentationController?.sourceView = rootViewController?.view
activityVC.popoverPresentationController?.sourceRect = .zero
        
rootViewController?.present(activityVC, animated: true, completion: nil)
like image 52
Trev14 Avatar answered Nov 14 '22 16:11

Trev14