実際によく使う順にアラート(UIAlertController)のテンプレをご用意しました。最後の全体コードをあなたのXcodeプロジェクトに新しくswiftファイルを作ってコピペすれば、すぐにご利用頂けます。
目次
タスク完了アラート
エラー発生アラート
短文説明アラート
二択(はいorいいえ)アラート
入力欄付きアラート
文字数オーバーアラート
入力破棄して画面巻き戻しアラート
全体コード
タスク完了アラート
static func taskDoneAlert(taskString: String, viewController: UIViewController, completion: (() -> Void)?) {
let alert = UIAlertController(title: "\(taskString)完了", message: "", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default) { action in
completion?()
}
alert.addAction(okAction)
viewController.present(alert, animated: true)
}
使用例↓
UIAlertController.taskDoneAlert(taskString: "保存", viewController: self) {
print("保存できましためでたしめでたし")
}
エラー発生アラート
static func errorAlert(viewController: UIViewController) {
let alert = UIAlertController(title: "エラー", message: "お手数ですがやり直してみてください\n申し訳ございません", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
alert.addAction(okAction)
viewController.present(alert, animated: true)
}
短文説明アラート
static func simpleDescriptionAlert(title: String, message: String, viewController: UIViewController) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .default)
alert.addAction(ok)
viewController.present(alert, animated: true)
}
使用例↓
UIAlertController.simpleDescriptionAlert(title: "お問い合わせ先", message: "090-1234-5678", viewController: self)
表示後に特に何も処理を走らせず、ただ説明だけしたいときによく使います。
二択アラート
static func yesOrNoAlert(alertTitle: String, alertMessage: String, viewController: UIViewController, yesAlertStyle: UIAlertAction.Style,
yesCompletion: ( @escaping () -> Void), noCompletion: ( @escaping () -> Void) ) {
let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
let yes = UIAlertAction(title: "はい", style: yesAlertStyle) { _ in
yesCompletion()
}
let no = UIAlertAction(title: "いいえ", style: .cancel) { _ in
noCompletion()
}
alert.addAction(yes)
alert.addAction(no)
viewController.present(alert, animated: true)
}
使用例↓
UIAlertController.yesOrNoAlert(alertTitle: "利用規約を開きますか?", alertMessage: "",
viewController: self, yesAlertStyle: .default) {
print("ここに規約を開く処理")
} noCompletion: {
print("ここに規約を開かない場合の処理")
}
入力欄付きアラート
static func textFieldAlert(alertTitle: String, alertMessage: String, placeholderText: String,
keyboardType: UIKeyboardType, doneButtonTitle: String, viewController: UIViewController, completion: ( @escaping (String) -> Void)) {
let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
alert.addTextField { (textField) in
textField.placeholder = placeholderText
textField.keyboardType = keyboardType
}
let done = UIAlertAction(title: doneButtonTitle, style: .default) { _ in
guard let textField = alert.textFields?.first, let inputText = textField.text else { return }
if inputText == "" {
UIAlertController.errorAlert(viewController: viewController)
} else {
completion(inputText)
}
}
let cancel = UIAlertAction(title: "キャンセル", style: .cancel)
alert.addAction(done)
alert.addAction(cancel)
viewController.present(alert, animated: true)
}
使用例↓
UIAlertController.textFieldAlert(alertTitle: "通報しますか?", alertMessage: "何があったか入力してください", placeholderText: "",
keyboardType: .default, doneButtonTitle: "送信", viewController: self) { text in
print("ここに入力欄の値textをどこかしらに送信する処理")
}
SNSなどユーザー同士でコミュニケーションとれるアプリで実装しないとAppStoreの審査に引っかかってしまうので、よくこのアラートを通報機能として使ってます。
keyboardTypeに.numberPadを指定すれば、画面遷移直前にユーザーに暗証番号を入力してもらうという使い方もできます。
文字数オーバーアラート
static func wordCoundOverAlert(wordLimit: Int, viewController: UIViewController) {
let alert = UIAlertController(title: "\(wordLimit)字までしか\n入力できません", message: "", preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .default)
alert.addAction(ok)
viewController.present(alert, animated: true)
}
使用例↓
UIAlertController.wordCoundOverAlert(wordLimit: 1000, viewController: self)
入力破棄して画面巻き戻しアラート
static func checkBackAlert(task: String, viewController: UIViewController) {
let alert = UIAlertController(title: "戻りますか?", message: "\(task)は破棄されます", preferredStyle: .alert)
let yes = UIAlertAction(title: "はい", style: .destructive) { _ in
viewController.navigationController?.popViewController(animated: true)
}
let no = UIAlertAction(title: "いいえ", style: .cancel)
alert.addAction(yes)
alert.addAction(no)
viewController.present(alert, animated: true)
}
使用例↓
UIAlertController.checkBackAlert(task: "入力内容", viewController: self)
入力された内容が保存されていないのにUINavigationControllerで前の画面に戻ろうとしている時に使っています。navigationItem.leftBarButtonItemに新しくキャンセルボタンを作っておいて、タップしたときに入力内容が保存されていない場合このメソッドを呼び出します。
削除が関わる選択なので、UIAlertActionのstyleを.destructiveにして赤くしています
全体コード
import UIKit
extension UIAlertController {
static func taskDoneAlert(taskString: String, viewController: UIViewController, completion: (() -> Void)?) {
let alert = UIAlertController(title: "\(taskString)完了", message: "", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default) { action in
completion?()
}
alert.addAction(okAction)
viewController.present(alert, animated: true)
}
static func errorAlert(viewController: UIViewController) {
let alert = UIAlertController(title: "エラー", message: "お手数ですがやり直してみてください\n申し訳ございません", preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
alert.addAction(okAction)
viewController.present(alert, animated: true)
}
static func simpleDescriptionAlert(title: String, message: String, viewController: UIViewController) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .default)
alert.addAction(ok)
viewController.present(alert, animated: true)
}
static func yesOrNoAlert(alertTitle: String, alertMessage: String, viewController: UIViewController, yesAlertStyle: UIAlertAction.Style,
yesCompletion: ( @escaping () -> Void), noCompletion: ( @escaping () -> Void) ) {
let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
let yes = UIAlertAction(title: "はい", style: yesAlertStyle) { _ in
yesCompletion()
}
let no = UIAlertAction(title: "いいえ", style: .cancel) { _ in
noCompletion()
}
alert.addAction(yes)
alert.addAction(no)
viewController.present(alert, animated: true)
}
static func textFieldAlert(alertTitle: String, alertMessage: String, placeholderText: String,
keyboardType: UIKeyboardType, doneButtonTitle: String, viewController: UIViewController, completion: ( @escaping (String) -> Void)) {
let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
alert.addTextField { (textField) in
textField.placeholder = placeholderText
textField.keyboardType = keyboardType
}
let done = UIAlertAction(title: doneButtonTitle, style: .default) { _ in
guard let textField = alert.textFields?.first, let inputText = textField.text else { return }
if inputText == "" {
UIAlertController.errorAlert(viewController: viewController)
} else {
completion(inputText)
}
}
let cancel = UIAlertAction(title: "キャンセル", style: .cancel)
alert.addAction(done)
alert.addAction(cancel)
viewController.present(alert, animated: true)
}
static func wordCoundOverAlert(wordLimit: Int, viewController: UIViewController) {
let alert = UIAlertController(title: "\(wordLimit)字までしか\n入力できません", message: "", preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .default)
alert.addAction(ok)
viewController.present(alert, animated: true)
}
static func checkBackAlert(task: String, viewController: UIViewController) {
let alert = UIAlertController(title: "戻りますか?", message: "\(task)は破棄されます", preferredStyle: .alert)
let yes = UIAlertAction(title: "はい", style: .destructive) { _ in
viewController.navigationController?.popViewController(animated: true)
}
let no = UIAlertAction(title: "いいえ", style: .cancel)
alert.addAction(yes)
alert.addAction(no)
viewController.present(alert, animated: true)
}
}