web-dev-qa-db-de.com

Wie migriere ich von UIAlertView (veraltet in iOS8)

Ich habe derzeit die folgende Codezeile in einer meiner Apps. Es ist eine einfache UIAlertView. Seit iOS 8 ist dies jedoch veraltet:

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

Wie aktualisiere ich dies, um mit iOS 8+ zu arbeiten? Ich glaube, ich muss etwas in UIAlertCotroller ändern, obwohl ich nicht genau weiß, was.

27
Dom Bryan

Sie müssen stattdessen UIAlertController verwenden. Dokumentation zur Klasse ist ziemlich unkompliziert und enthält sogar ein Anwendungsbeispiel in Listing 1 ganz am Anfang des Dokuments (sicher, dass es sich in ObjC und nicht in Swift befindet, aber es ist ziemlich ähnlich).

Für Ihren Anwendungsfall wird dies folgendermaßen übersetzt (mit zusätzlichen Kommentaren):

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){}

Der kompakte Code sieht also so aus:

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){}

Wobei self hier Ihre UIViewController sein soll.


Zusätzlicher Tipp: Wenn Sie diesen Code aufrufen müssen, der die Warnung außerhalb des Kontextes einer UIViewController anzeigt (wobei self keine UIViewController ist), können Sie immer den Stamm VC Ihrer App verwenden:

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

(Im Allgemeinen ist es jedoch vorzuziehen, eine bekannte UIViewController zu verwenden, wenn Sie eine haben - und Sie im Allgemeinen ohnehin Alarme von UIViewControllers anzeigen - oder versuchen Sie, abhängig von Ihrem Kontext die geeignetste zu erhalten, anstatt sich auf diesen Tipp zu verlassen.)

62
AliSoftware

Für diejenigen, die sich fragen, wie dies in Objective-C zu tun ist:

    //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];

Dadurch wird eine Warnmeldung angezeigt, die wie folgt aussieht:

 alert example

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

wird

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:

Verwenden Sie AlertController.

Beispiel für Aktionsblatt:

  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)

Beispiel für Alerts:

1) 

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

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

2) Warnung mit TextField drin.

  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

Ich denke, dies ist der Weg, um Abwärtskompatibilität für ältere iOS-SDKs zu haben und bei Verwendung eines neueren SDKs eine neue API zu verwenden. Es ist auch ohne Warnungen für die Verwendung von veralteter Klasse in Code. 

    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

Dieser Wrapper bietet eine Möglichkeit, UIAlertView problemlos in UIAlertController zu konvertieren. UIAlertView ist von iOS 9.0 veraltet. Konvertieren Sie Ihre UIAlertView von alten Projekten in UIAlertController, wobei Ihre Delegatenimplementierung mit dieser UIAlertControllerWrapper unverändert bleibt, und entfernen Sie alle UIAlertView-bezogenen warnings.

0
Torongo

Die obigen Beispiele haben mir nicht viel geholfen. Meine Lösung ist für XCode 6.4., Swift 1.2. Sie können diesen Code in ein Testprojekt kopieren und einfügen, um ein Gefühl für die Funktionsweise zu erhalten:

LÖSUNG 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)
    }

}

Ich habe diese Lösung in Xcode 7.0 geprüft. Es funktionierte. Xcode hat eine Änderung vorgenommen. Ich habe es in Xcode 6.4 erneut kompiliert und es hat funktioniert. Die Änderungen für Swift 2.0 sollten geringfügig sein, wenn überhaupt vorhanden.

Hoffe das hilft ;)

0
MB_iOSDeveloper

Sie können diesen Code für die Warnungsansicht verwenden:

 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];

Für mehrere Tasten können Sie verwenden:

 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