web-dev-qa-db-fra.com

Comment puis-je migrer depuis UIAlertView (obsolète dans iOS8)

J'ai actuellement la ligne de code suivante dans l'une de mes applications. C'est un simple UIAlertView. Cependant, à partir de iOS 8, il est maintenant obsolète:

let alertView = UIAlertView(title: "Oops!", message: "This feature isn't available right now", delegate: self, cancelButtonTitle: "OK")

Comment puis-je mettre à jour cette fonctionnalité pour fonctionner avec iOS 8+? Je crois que je dois changer quelque chose en UIAlertCotroller, bien que je ne sois pas trop sûr de quoi.

27
Dom Bryan

Vous devez utiliser UIAlertController à la place. To class documentation est assez simple, et contient même un exemple d'utilisation dans le Listing 1 au tout début du document (bien que ce soit dans ObjC et non dans Swift, mais il est assez similaire).

Donc, pour votre cas d'utilisation, voici comment cela se traduit (avec des commentaires ajoutés):

let alert = UIAlertController(title: "Oops!", message:"This feature isn't available right now", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default) { _ in
  // Put here any code that you would like to execute when
  // the user taps that OK button (may be empty in your case if that's just
  // an informative alert)
}
alert.addAction(action)
self.presentViewController(alert, animated: true){}

Le code compact ressemblera donc à:

let alert = UIAlertController(title: "Oops!", message:"This feature isn't available right now", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.present(alert, animated: true){}

self est censé être votre UIViewController.


Conseil supplémentaire: si vous devez appeler ce code qui affiche l'alerte en dehors du contexte d'une UIViewController (où self n'est pas une UIViewController), vous pouvez toujours utiliser la racine VC de votre application:

let rootVC = UIApplication.sharedApplication().keyWindow?.rootViewController
rootVC?.presentViewController(alert, animated: true){}

(Mais en général, il est préférable d'utiliser une variable UIViewController lorsque vous en avez une - et que vous présentez généralement les alertes d'UIViewControllers de toute façon - ou essayez de choisir celle qui convient le mieux en fonction de votre contexte plutôt que de vous fier à cette astuce)

62
AliSoftware

Pour ceux qui se demandent comment faire cela en Objective-C:

    //Step 1: Create a UIAlertController
    UIAlertController *myAlertController = [UIAlertController alertControllerWithTitle:@"MyTitle"
                                                              message: @"MyMessage"
                                                              preferredStyle:UIAlertControllerStyleAlert                   ];

    //Step 2: Create a UIAlertAction that can be added to the alert
    UIAlertAction* ok = [UIAlertAction
                         actionWithTitle:@"OK"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             //Do some thing here, eg dismiss the alertwindow
                             [myAlertController dismissViewControllerAnimated:YES completion:nil];

                         }];

    //Step 3: Add the UIAlertAction ok that we just created to our AlertController
    [myAlertController addAction: ok];

    //Step 4: Present the alert to the user
    [self presentViewController:myAlertController animated:YES completion:nil];

Cela fera apparaître une alerte qui ressemble à ceci:

 alert example

31
RWIL
let alertView = UIAlertView(title: "Oops!", message: "This feature isn't available right now", delegate: self, cancelButtonTitle: "OK")

devient

let alertController = UIAlertController(title: "Oops!", message: "This feature isn't available right now", preferredStyle: .Alert)
let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in }
alertController.addAction(OKAction)
self.presentViewController(alertController, animated: true) { }
4
Miknash

Swift 2.0:

Utilisez AlertController.

Exemple de fiche d'action:

  let mediaActionSheet: UIAlertController = UIAlertController(title: "Media Action Sheet", message: "Choose an option!", preferredStyle: .ActionSheet)

  //Create and add the Cancel action
  let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in

   //Just dismiss the action sheet

  }
  mediaActionSheet.addAction(cancelAction)
  //Create and add first option action
  let takePictureAction: UIAlertAction = UIAlertAction(title: "Take Picture", style: .Default) { action -> Void in

   //Code for launching the camera goes here

  }

  mediaActionSheet.addAction(takePictureAction)

  //Create and add a second option action
  let choosePictureAction: UIAlertAction = UIAlertAction(title: "Choose From Gallery", style: .Default) { action -> Void in

   //Code for picking from gallery goes here

  }

  mediaActionSheet.addAction(choosePictureAction)

  //Present the AlertController
  self.presentViewController(mediaActionSheet, animated: true, completion: nil)

Exemple d'alertes:

1) 

let simpleAlert = UIAlertController(title: "Simple Alert", message: "It is just awesome", preferredStyle: UIAlertControllerStyle.Alert);

  //show it
  showViewController(simpleAlert, sender: self);

2) Alerte avec TextField en elle.

  let inputTextFieldAlert:UIAlertController = UIAlertController(title: " Input TextField Alert ", message: " Enter on the below TextField ", preferredStyle: UIAlertControllerStyle.Alert);

  //default input textField (no configuration...)
  inputTextFieldAlert.addTextFieldWithConfigurationHandler(nil);

  //no event handler (just close dialog box)
  inputTextFieldAlert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.Cancel, handler: nil));

  //event handler with closure
  inputTextFieldAlert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default, handler: {(action:UIAlertAction) in

   let fields = inputTextFieldAlert.textFields!;
   print("Output: "+fields[0].text!);
  }));

  presentViewController(inputTextFieldAlert, animated: true, completion: nil);

3)

var alert = UIAlertController(title: "TextField Alert", message: "Enter on the below TextField", preferredStyle: UIAlertControllerStyle.Alert);

  //configured input textField
  var field:UITextField?;

  alert.addTextFieldWithConfigurationHandler({(input:UITextField)in
   input.placeholder="Empty Dtaa ;-)";
   input.clearButtonMode=UITextFieldViewMode.WhileEditing;

   field=input;
  });

  //YES Handler
  func yesHandler(actionTarget: UIAlertAction){

   print(field!.text!);
  }
  //event handler with predefined function
  alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default, handler: yesHandler));

  presentViewController(alert, animated: true, completion: nil);
1
A.G

Je pense que c’est le moyen d’avoir une compatibilité ascendante pour les anciens SDK iOS et d’utiliser une nouvelle API lors de l’utilisation du SDK récent. En outre, il est sans avertissements pour la dépréciation du code en utilisant la classe obsolète. 

    if ([UIAlertController class]) {
        // Use new API to create alert controller, add action button and display it
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"CityBoard" message:error.errorDescription preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction* ok = [UIAlertAction actionWithTitle: @"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
            [alertController dismissViewControllerAnimated:YES completion:nil];
        }];
        [alertController addAction: ok];
        [self presentViewController:alertController animated:YES completion:nil];
    } else {
        // We are running on old SDK as the new class is not available
        // Hide the compiler errors about deprecation and use the class available on older SDK
#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"CityBoard"
                                                        message:error.errorDescription
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
#pragma clang diagnostic pop
1
zveljkovic

https://github.com/nagibazad/UIAlertControllerWrapper

Ce wrapper permet de convertir facilement UIAlertView en UIAlertController. UIAlertView est déconseillé à partir de iOS 9.0. Convertissez votre UIAlertView d'anciens projets en UIAlertController en conservant la même implémentation de délégué en utilisant cette UIAlertControllerWrapper et supprimez toutes les UIAlertView relatives warnings.

0
Torongo

Les exemples ci-dessus ne m'ont pas beaucoup aidé. Ma solution est pour XCode 6.4., Swift 1.2 et vous pouvez copier et coller ce code dans un projet test pour avoir une idée de son fonctionnement:

SOLUTION 1 - Swift 1.2:  

import UIKit

let ALERT_TITLE   = "Got you working, right?"
let ALERT_MESSAGE = "Well maybe..."

class ViewController: UIViewController
{
    private var alert: UIAlertController!

    private var presentAlertButton: UIButton!

    override func viewDidAppear(animated: Bool)
    {
        /*
        // QUICK TEST - 1
        self.presentViewController(alert, animated: true, completion: nil)
        */


        // QUCIK TEST - 2
        /*
        let rootVC = UIApplication.sharedApplication().keyWindow?.rootViewController
        rootVC?.presentViewController(alert, animated: true, completion: nil)
        */
    }

    override func viewDidLoad()
    {
        super.viewDidLoad()

        createAndAddAlertV()

        createAndAddAlertButton()
    }

    private func createAndAddAlertV()
    {
        alert = UIAlertController(title:ALERT_TITLE, message:ALERT_MESSAGE, preferredStyle: .Alert)
        let alertAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
        alert.addAction(alertAction)
    }

    private func createAndAddAlertButton()
    {
        presentAlertButton = UIButton(frame: CGRectMake(
            view.frame.size.width / 2,
            view.frame.size.height / 2,
            200,
            100))

        presentAlertButton.layer.anchorPoint = CGPointMake(1.0, 1.0)
        presentAlertButton.backgroundColor = UIColor.redColor()
        presentAlertButton.setTitle("Click For Alert", forState: .Normal)
        presentAlertButton.addTarget(self, action: "showAlertV", forControlEvents: .TouchUpInside)
        self.view.addSubview(presentAlertButton)
    }

    @IBAction func showAlertV()
    {
        println(" Showing... ")
        self.presentViewController(alert, animated: true, completion: nil)
    }

}

J'ai vérifié cette solution dans Xcode 7.0. Ça a marché. Xcode a fait un changement. Je l'ai recompilé à nouveau dans Xcode 6.4 et cela a fonctionné. Les changements pour Swift 2.0 devraient être mineurs, voire inexistants.

J'espère que cela t'aides ;)

0
MB_iOSDeveloper

Vous pouvez utiliser ce code pour la vue Alerte:

 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
        [alertController addAction:ok];

        [self presentViewController:alertController animated:YES completion:nil];

Pour plusieurs boutons, vous pouvez utiliser:

 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];

        [alertController addAction:[UIAlertAction actionWithTitle:@"Button 1" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            [self loadGooglrDrive];
        }]];

        [alertController addAction:[UIAlertAction actionWithTitle:@"Button 2" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            [self loadDropBox];
        }]];

        [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            [self closeAlertview];
        }]];

        dispatch_async(dispatch_get_main_queue(), ^ {
            [self presentViewController:alertController animated:YES completion:nil];
        });

-(void)closeAlertview
{

    [self dismissViewControllerAnimated:YES completion:nil];
}
0
Nithinbemitk