Quelqu'un reçoit ce message en essayant de montrer UIActionSheet de popover?
Votre application a présenté un UIAlertController () de style UIAlertControllerStyleActionSheet. Le modalPresentationStyle d'un UIAlertController avec ce style est UIModalPresentationPopover. Vous devez fournir des informations de localisation pour ce popover via popoverPresentationController du contrôleur d'alerte. Vous devez fournir un sourceView et sourceRect ou un barButtonItem. Si ces informations ne sont pas connues lorsque vous présentez le contrôleur d'alertes, vous pouvez les fournir dans la méthode UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation.
Avant la GM, j’avais utilisé une solution de contournement pour convertir UIActionSheet en UIAlertController et cela fonctionnait très bien . Cependant, il semble que Apple ait essayé de résoudre les problèmes de UIActionSheet et je ne voulais pas utiliser ma solution de contournement - mais il semble que je n'ai pas le choix ...
Pour prendre en charge l'iPad, incluez ce code:
alertView.popoverPresentationController?.sourceView = self.view
alertView.popoverPresentationController?.sourceRect = self.view.bounds
// this is the center of the screen currently but it can be any point in the view
self.presentViewController(alertView, animated: true, completion: nil)
Si vous présentez la feuille d'action après que l'utilisateur a effectué une sélection sur une cellule dans une UITableView
. J'ai trouvé que cela fonctionne décemment bien:
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Directions"
message:@"Select mode of transportation:"
preferredStyle:UIAlertControllerStyleActionSheet];
alert.popoverPresentationController.sourceView = cell;
alert.popoverPresentationController.sourceRect = cell.bounds;
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
//...
[self presentViewController:alert animated:YES completion:nil];
Vous devez fournir popoverPresentationController
pour iPad. Dans ce cas, vous spécifiez barButtonItem
ou sourceView
. Cette autre discussion peut vous aider: Swift UIAlertController - ActionSheet iPad iOS8 Crashes
En fait, c’est quelque chose de buggé (je crois) dans Xcode pour iPhone et iPad.
alert.popoverPresentationController.sourceView = self.view;
alert.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0 - 105, self.view.bounds.size.height / 2.0 + 70, 1.0, 1.0);
105 et 70, soit les différences de dimensions approximatives pour la conception de portraits sur iPad en raison du point d’ancrage différent.UIAlertController
est fourni avec la 'vue modale', mais malheureusement, si vous utilisez le même code pour iPad, il ne s'agira pas d'une 'vue modale'. Cela signifie que vous devez écrire du code supplémentaire pour désactiver les touches dans la conception de l'iPad. Je pense que c'est bizarre.Ce sont les choses étranges que je vois. Je pense qu'il doit y avoir une norme et si quelqu'un veut établir des normes, très bien, il peut y avoir d'autres options.
UIAlertController étant uniquement iOS8 et devant prendre en charge iOS7, je l'utilise. Je me suis heurté à cela dans une vue principale dans une disposition maître/détail sur iPad. J'ai pu contourner ce problème (pas exactement le corriger) en soulevant la feuille UIActionSheet à partir du parent UISplitViewController à l'aide de [actionSheet showInView:]. Bonne chance.
Si vous souhaitez le présenter au centre sans flèches sur les iPad et normalement sur les iPhones: [ 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)