IOS 8 iPad App Crashes When UIActivityViewController Is Called

If you read the error it says how to fix it, you need to set the barButtonItem or sourceView from which to present the popover from, in your case:

func shareButtonPress(pressedButton: UIBarButtonItem) { 

    ...

    activityViewController.popoverPresentationController.barButtonItem = pressedButton

    self.presentViewController(activityViewController, animated: true, completion: nil)
}

Swift 5:

Check if the device is iPhone or iPad and based on that add a sourceView and present the activityController

let activity = UIActivityViewController(activityItems: [self], applicationActivities: nil)
if UIDevice.current.userInterfaceIdiom == .phone {
    UIApplication.topViewController?.present(activity, animated: true, completion: nil)
} else {
    activity.popoverPresentationController?.sourceView = UIApplication.topViewController!.view
    UIApplication.topViewController?.present(activity, animated: true, completion: nil)
}

There are two option, the action came from a UIBarButtonitem or UIButton that is a UIView.

func shareButtonPress() {

    ...

    if let actv = activityViewController.popoverPresentationController {
        actv.barButtonItem = someBarButton // if it is a UIBarButtonItem

        // Or if it is a view you can get the view rect
        actv.sourceView = someView
        // actv.sourceRect = someView.frame // you can also specify the CGRect
    }

    self.presentViewController(activityViewController, animated: true, completion: nil)
}

You may have to add a sender to your function like func shareButtonPress(sender: UIBarButtonItem) or func shareButtonPress(sender: UIButton)


Before presenting the UIActivityViewController, add in this line of code:

activityViewController.popoverPresentationController?.sourceView = self.view

This way, the view controller knows in which frame of the GameViewController to appear in.