Présenter un UIAlertController correctement sur un iPad en utilisant iOS 8

Avec iOS 8.0, Apple a introduit UIAlertController pour replace UIActionSheet . Malheureusement, Apple n'a ajouté aucune information sur la façon de le présenter. J'ai trouvé une input à ce sujet sur le blog de hayaGeek, cependant, ça ne semble pas fonctionner sur iPad. La vue est totalement déplacée:

Mal placé: Image mal placée

Correct: entrez la description de l'image ici

J'utilise le code suivant pour le montrer sur l'interface:

let alert = UIAlertController() // setting buttons self.presentModalViewController(alert, animated: true) 

Y a-t-il une autre façon de l'append pour iPad? Ou Apple a-t-il oublié l'iPad, ou pas encore implémenté?

    Vous pouvez présenter un UIAlertController partir d'un popover en utilisant UIPopoverPresentationController .

    En Obj-C:

     UIViewController *self; // code assumes you're in a view controller UIButton *button; // the button you want to show the popup sheet from UIAlertController *alertController; UIAlertAction *destroyAction; UIAlertAction *otherAction; alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; destroyAction = [UIAlertAction actionWithTitle:@"Remove All Data" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { // do destructive stuff here }]; otherAction = [UIAlertAction actionWithTitle:@"Blah" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // do something here }]; // note: you can control the order buttons are shown, unlike UIActionSheet [alertController addAction:destroyAction]; [alertController addAction:otherAction]; [alertController setModalPresentationStyle:UIModalPresentationPopover]; UIPopoverPresentationController *popPresenter = [alertController popoverPresentationController]; popPresenter.sourceView = button; popPresenter.sourceRect = button.bounds; [self presentViewController:alertController animated:YES completion:nil]; 

    Sur iPad, l'alerte s'affichera en tant que survol à l'aide du nouveau UIPopoverPresentationController . Elle nécessite que vous spécifiiez un point d'ancrage pour la présentation du survol en utilisant soit un sourceView et un sourceRect, soit un barButtonItem

    • barButtonItem
    • sourceView
    • sourceRect

    Pour spécifier le point d'ancrage, vous devez get une reference au UIPopoverPresentationController du UIAlertController et définir l'une des propriétés comme suit:

     alertController.popoverPresentationController.barButtonItem = button; 

    exemple de code:

     UIAlertAction *actionDelete = nil; UIAlertAction *actionCancel = nil; // create action sheet UIAlertController *alertController = [UIAlertController alertControllerWithTitle:actionTitle message:nil preferredStyle:UIAlertControllerStyleActionSheet]; // Delete Button actionDelete = [UIAlertAction actionWithTitle:NSLocalizedSsortingng(@"IDS_LABEL_DELETE", nil) style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { // Delete // [self deleteFileAtCurrentIndexPath]; }]; // Cancel Button actionCancel = [UIAlertAction actionWithTitle:NSLocalizedSsortingng(@"IDS_LABEL_CANCEL", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { // cancel // Cancel code }]; // Add Cancel action [alertController addAction:actionCancel]; [alertController addAction:actionDelete]; // show action sheet alertController.popoverPresentationController.barButtonItem = button; alertController.popoverPresentationController.sourceView = self.view; [self presentViewController:alertController animated:YES completion:nil]; 

    Dans Swift 2, vous voulez faire quelque chose comme ça pour le montrer correctement sur iPhone et iPad:

     func confirmAndDelete(sender: AnyObject) { guard let button = sender as? UIView else { return } let alert = UIAlertController(title: NSLocalizedSsortingng("Delete Contact?", comment: ""), message: NSLocalizedSsortingng("This action will delete all downloaded audio files.", comment: ""), preferredStyle: .ActionSheet) alert.modalPresentationStyle = .Popover let action = UIAlertAction(title: NSLocalizedSsortingng("Delete", comment: ""), style: .Destructive) { action in EarPlaySDK.deleteAllResources() } let cancel = UIAlertAction(title: NSLocalizedSsortingng("Cancel", comment: ""), style: .Cancel) { action in } alert.addAction(cancel) alert.addAction(action) if let presenter = alert.popoverPresentationController { presenter.sourceView = button presenter.sourceRect = button.bounds } presentViewController(alert, animated: true, completion: nil) } 

    Si vous ne définissez pas le présentateur, vous vous refindez avec une exception sur iPad dans -[UIPopoverPresentationController presentationTransitionWillBegin] avec le message suivant:

    Exception fatale: NSGenericException Votre application a présenté un UIAlertController (<UIAlertController: 0x17858a00>) de style UIAlertControllerStyleActionSheet. Le modalPresentationStyle d'un UIAlertController avec ce style est UIModalPresentationPopover. Vous devez fournir des informations de localization pour ce survol via le popoverPresentationController du controller d'alerte. Vous devez fournir un sourceView et un sourceRect ou un barButtonItem. Si cette information n'est pas connue lorsque vous présentez le controller d'alerte, vous pouvez le fournir dans la méthode UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation.

    Voici une solution rapide:

     NSSsortingng *text = self.contentTextView.text; NSArray *items = @[text]; UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; activity.excludedActivityTypes = @[UIActivityTypePostToWeibo]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { //activity.popoverPresentationController.sourceView = shareButtonBarItem; activity.popoverPresentationController.barButtonItem = shareButtonBarItem; [self presentViewController:activity animated:YES completion:nil]; } [self presentViewController:activity animated:YES completion:nil]; 

    Mise à jour pour Swift 3.0 et supérieur

      let actionSheetController: UIAlertController = UIAlertController(title: "SomeTitle", message: nil, preferredStyle: .actionSheet) let editAction: UIAlertAction = UIAlertAction(title: "Edit Details", style: .default) { action -> Void in print("Edit Details") } let deleteAction: UIAlertAction = UIAlertAction(title: "Delete Item", style: .default) { action -> Void in print("Delete Item") } let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in } actionSheetController.addAction(editAction) actionSheetController.addAction(deleteAction) actionSheetController.addAction(cancelAction) // present(actionSheetController, animated: true, completion: nil) // doesn't work for iPad actionSheetController.popoverPresentationController?.sourceView = yourSourceViewName // works for both iPhone & iPad present(actionSheetController, animated: true) { print("option menu presented") }