Swift UIAlertController -> ActionSheet iPad iOS8 Crashes
try this
alertController.popoverPresentationController?.sourceView = self.view
If you want to present it in the centre with no arrows on iPads [Swift 3+]:
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = self.view
popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
popoverController.permittedArrowDirections = []
}
self.present(alertController, animated: true, completion: nil)
Nate Cook is totally right however I would do it so I detect if it is iPad or iPhone.
This is for barButtonItem
:
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad ){
if let currentPopoverpresentioncontroller = alertController.popoverPresentationController{
currentPopoverpresentioncontroller.barButtonItem = sender as! UIBarButtonItem
currentPopoverpresentioncontroller.permittedArrowDirections = UIPopoverArrowDirection.down;
self.present(alertController, animated: true, completion: nil)
}
}else{
self.present(alertController, animated: true, completion: nil)
}
The error message is telling you that you need to give the alert controller's popoverPresentationController
a location so that it can position itself properly. This is easy to do -- just check to see if there's a popover controller and add the sender as the source.
If your button is a UIBarButtonItem
:
if let popoverController = alertController.popoverPresentationController {
popoverController.barButtonItem = sender
}
self.presentViewController(alertController, animated: true, completion: nil)
Otherwise:
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = sender
popoverController.sourceRect = sender.bounds
}
self.presentViewController(alertController, animated: true, completion: nil)