Где найти четкое объяснение о swift alert (UIAlertController)?
не удалось найти ясного и информативного объяснения этому.
3 ответов
после поиска некоторое время на тему, что я не найдите четкое объяснение, даже в его Class reference UIAlertController Reference
это нормально, но недостаточно ясно для меня.
Итак, собрав некоторые миры, я решил сделать свое собственное объяснение (Надеюсь, это поможет)
Итак...
-
UIAlertView
устарел, как указано : UIAlertView в Swift -
UIAlertController
должен использоваться в iOS8+ поэтому, чтобы создать его сначала, нам нужно создать его экземпляр, конструктор (init) получает 3 параметра:
2.1 название: строка - > большой жирный текст для отображения в верхней части диалогового окна оповещения
2.2 сообщение: строка - > меньший текст (в значительной степени объясняет это самостоятельно)
2.3 prefferedStyle:UIAlertControllerStyle
-> определить стиль диалогового окна, в большинстве случаев: UIAlertControllerStyle.Alert
теперь, чтобы показать его пользователю, мы можем использовать
showViewController
илиpresentViewController
и передайте наше предупреждение как параметрчтобы добавить взаимодействие с пользователем, мы можем использовать:
4.1
UIAlertController.addAction
для создания кнопок
4.2
UIAlertController.addTextField
для создания текстовых полей
редактировать Примечание: примеры кода ниже, обновлены для синтаксиса swift 3
Пример 1: простой Диалоговое окно
@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);
}
Пример 2: диалог с одним входным текстовым полем и двумя кнопками
@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);
}
Пример 3: одно настроенное текстовое поле ввода и одна кнопка
@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);
}
надеюсь, это поможет, и удачи ; -)
экземпляр UIAlertController может быть представлен модально на экране так же, как и любой другой UIViewController, используя метод presentViewController:animated:completion:. Что заставляет экземпляр UIAlertController различать работу как ActionSheet или как AlertView-это параметр style, который вы передаете при его создании.
нет больше делегации
Если вы использовали UIActionSheet или UIAlertView, вы знаете что способ получить обратный вызов от него для класса (в большинстве случаев ViewController) для реализации протокола UIActionSheetDelegate или uialertviewdelegate. Есть несколько проектов с открытым исходным кодом, которые заменили этот шаблон делегирования обратными вызовами на основе блоков, но официальные API никогда не обновлялись. UIAlertController не использует делегирование. Вместо этого он имеет коллекцию элементов UIAlertAction, которые используют замыкания (или блоки, если вы используете Objective-C) для обработки пользователя вход.
Для Листа Действий
@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)
}
для AlertView с текстовым полем
@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)
}
некоторые синтаксис изменился с момента исходных ответов. Вот пример кода, который предупреждает пользователя, если он не вошел в 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")
}
}