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.
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.)
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:
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) { }
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);
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
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
.
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 ;)
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];
}