ios - ¿Dónde encontrar una explicación clara sobre la alerta rápida(UIAlertController)?
uialertcontroller swift 4 (3)
Una instancia del UIAlertController se puede presentar de manera modal en la pantalla, al igual que cualquier otro UIViewController que utilice el método presentViewController: animated: completed: Lo que hace que la instancia de UIAlertController se distinga entre trabajar como ActionSheet o como AlertView es el parámetro de estilo que se pasa al crearlo.
No mas delegacion
Si ha usado una UIActionSheet o UIAlertView, sabe que la forma de obtener una devolución de llamada es para una clase (en la mayoría de los casos, el controlador de vista) para implementar el protocolo UIActionSheetDelegate o UIAlertViewDelegate. Hay algunos proyectos de código abierto que reemplazaron este patrón de delegación con devoluciones de llamadas basadas en bloques, pero las API oficiales nunca se actualizaron. UIAlertController no utiliza delegación. En su lugar, tiene una colección de elementos UIAlertAction, que usan cierres (o bloques si está utilizando Objective-C) para manejar la entrada del usuario.
Para la hoja de acción
@IBAction func showActionSheet(sender: AnyObject) {
//Create the AlertController
let actionSheetController: UIAlertController = UIAlertController(title: "Action Sheet", message: "Swiftly Now! 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
}
actionSheetController.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
}
actionSheetController.addAction(takePictureAction)
//Create and add a second option action
let choosePictureAction: UIAlertAction = UIAlertAction(title: "Choose From Camera Roll", style: .Default) { action -> Void in
//Code for picking from camera roll goes here
}
actionSheetController.addAction(choosePictureAction)
//Present the AlertController
self.presentViewController(actionSheetController, animated: true, completion: nil)
}
Para AlertView con campo de texto
@IBAction func showAlert(sender: AnyObject) {
//Create the AlertController
let actionSheetController: UIAlertController = UIAlertController(title: "Alert", message: "Swiftly Now! Choose an option!", preferredStyle: .Alert)
//Create and add the Cancel action
let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
//Do some stuff
}
actionSheetController.addAction(cancelAction)
//Create and an option action
let nextAction: UIAlertAction = UIAlertAction(title: "Next", style: .Default) { action -> Void in
//Do some other stuff
}
actionSheetController.addAction(nextAction)
//Add a text field
actionSheetController.addTextFieldWithConfigurationHandler { textField -> Void in
//TextField configuration
textField.textColor = UIColor.blueColor()
}
//Present the AlertController
self.presentViewController(actionSheetController, animated: true, completion: nil)
}
No se pudo encontrar una explicación clara e informativa para esto.
Después de buscar un tema sobre un tema, no encontré una explicación clara, incluso en su referencia de clase UIAlertController Reference
Está bien, pero no lo suficientemente claro para mí.
Entonces, después de recoger algunas paces, decidí hacer mi propia explicación (espero que ayude)
Así que aquí va:
-
UIAlertView
está en desuso como se señaló: UIAlertView en Swift -
UIAlertController
debe usarse en iOS8 +, por lo tanto, para crear uno primero, necesitamos crear una instancia, el Constructor (init) obtiene 3 parámetros:
2.1 título: Cadena -> texto en negrita para mostrar en la parte superior del cuadro de diálogo de alerta
Mensaje 2.2: Cadena -> texto más pequeño (se explica bastante a sí mismo)
2.3 prefferedStyle:UIAlertControllerStyle
-> definir el estilo del cuadro de diálogo, en la mayoría de los casos: UIAlertControllerStyle.Alert
Ahora para mostrarlo realmente al usuario, podemos usar
showViewController
opresentViewController
y pasar nuestra alerta como parámetroPara agregar alguna interacción con un usuario podemos usar:
4.1 UIAlertController.addAction
para crear botones
4.2 UIAlertController.addTextField
para crear campos de texto
Nota de edición: ejemplos de código a continuación, actualizados para la sintaxis de swift 3
Ejemplo 1 : diálogo simple
@IBAction func alert1(sender: UIButton) {
//simple alert dialog
let alert=UIAlertController(title: "Alert 1", message: "One has won", preferredStyle: UIAlertControllerStyle.alert);
//show it
show(alert, sender: self);
}
Ejemplo 2 : Diálogo con un campo de entrada de texto y dos botones
@IBAction func alert2(sender: UIButton) {
//Dialog with one input textField & two buttons
let alert=UIAlertController(title: "Alert 2", message: "Two will win too", preferredStyle: UIAlertControllerStyle.alert);
//default input textField (no configuration...)
alert.addTextField(configurationHandler: nil);
//no event handler (just close dialog box)
alert.addAction(UIAlertAction(title: "No", style: UIAlertActionStyle.cancel, handler: nil));
//event handler with closure
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: {(action:UIAlertAction) in
let fields = alert.textFields!;
print("Yes we can: "+fields[0].text!);
}));
present(alert, animated: true, completion: nil);
}
Ejemplo 3 : Un campo de entrada de texto personalizado y un botón
@IBAction func alert3(sender: UIButton) {
// one input & one button
let alert=UIAlertController(title: "Alert 3", message: "Three will set me free", preferredStyle: UIAlertControllerStyle.alert);
//configured input textField
var field:UITextField?;// operator ? because it''s been initialized later
alert.addTextField(configurationHandler:{(input:UITextField)in
input.placeholder="I am displayed, when there is no value ;-)";
input.clearButtonMode=UITextFieldViewMode.whileEditing;
field=input;//assign to outside variable(for later reference)
});
//alert3 yesHandler -> defined in the same scope with alert, and passed as event handler later
func yesHandler(actionTarget: UIAlertAction){
print("YES -> !!");
//print text from ''field'' which refer to relevant input now
print(field!.text!);//operator ! because it''s Optional here
}
//event handler with predefined function
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: yesHandler));
present(alert, animated: true, completion: nil);
}
Espero que ayude, y buena suerte ;-)
Parte de la sintaxis ha cambiado desde las respuestas originales. Aquí hay un código de muestra que alerta al usuario si no ha iniciado sesión en iCloud.
CKContainer.default().accountStatus { (accountStatus, error) in
switch accountStatus {
case .available:
print("iCloud Available")
case .noAccount:
print("No iCloud account")
//simple alert dialog
let alert=UIAlertController(title: "Sign in to iCloud", message: "This application requires iClound. Sign in to your iCloud account to write records. On the Home screen, launch Settings, tap iCloud, and enter your Apple ID. Turn iCloud Drive on. If you don''t have an iCloud account, tap Create a new Apple ID", preferredStyle: UIAlertControllerStyle.alert);
//no event handler (just close dialog box)
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil));
//show it
self.present(alert, animated: true, completion: nil)
case .restricted:
print("iCloud restricted")
case .couldNotDetermine:
print("Unable to determine iCloud status")
}
}