画面にメッセージを表示したり、ユーザーに動作を選択してもらう際に使用するUIAlertControllerの基本的な使用方法を説明します。従来UIAlertViewやUIActionSheetを使っていたところですが、iOS 8以降これらのクラスの使用は推奨されていませんのでご注意ください。

基本

UIAlertControllerを生成し、アクションを追加(アクションのイベントハンドラはクロージャで処理)、presentViewControllerでUIAlertControllerを表示というのが基本的な流れです。

AlertとActionSheetはUIAlertControllerの引数で変更することができます。

let alert = UIAlertController(title: "アラート", message: "アラートのメッセージです", preferredStyle: UIAlertControllerStyle.Alert)
let cancelAction = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.Cancel, handler: {
    (action:UIAlertAction!) -> Void in
     print("キャンセル")
})
alert.addAction(cancelAction)
presentViewController(alert, animated: true, completion: nil)

Alertの表示

通常の処理を行うデフォルトボタン、アイテムの削除など破壊的な処理を行うDestructiveボタン、キャンセル処理を行うキャンセルボタンを追加したAlertを表示するサンプルです。

S 2016 06 20 14 31 33 2

デフォルトボタン、Destructiveボタンは複数追加できるのに対し、キャンセルボタンは一つだけしか追加できないことに注意が必要です。

let alert = UIAlertController(title: "アラート", message: "アラートのメッセージです", preferredStyle: UIAlertControllerStyle.Alert)
//キャンセルアクション(1つだけ指定可能)
let cancelAction = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.Cancel, handler: {
    (action:UIAlertAction!) -> Void in
    print("キャンセル")
})
//デフォルトアクション(複数指定可能)
let defaultAction = UIAlertAction(title: "デフォルト", style: UIAlertActionStyle.Default, handler: {
    (action:UIAlertAction!) -> Void in
    print("デフォルト")
})
//破壊的アクション(複数指定可能)
let destructiveAction = UIAlertAction(title: "破壊", style: UIAlertActionStyle.Destructive, handler: {
    (action:UIAlertAction!) -> Void in
    print("破壊")
})
alert.addAction(cancelAction)
alert.addAction(defaultAction)
alert.addAction(destructiveAction)
presentViewController(alert, animated: true, completion: nil)

Action Sheetの表示

通常の処理を行うデフォルトボタン、アイテムの削除など破壊的な処理を行うDestructiveボタン、キャンセル処理を行うキャンセルボタンを追加したAction Sheetを表示するサンプルです。

S 2016 06 20 14 31 48 2

UIAlertControllerの引数が「UIAlertControllerStyle.ActionSheet」になっているだけで後はAlertを表示する場合と同じです。

let alert = UIAlertController(title: "アクションシート", message: "アクションシートのメッセージです", preferredStyle: UIAlertControllerStyle.ActionSheet)
//キャンセルアクション(1つだけ指定可能)
let cancelAction = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.Cancel, handler: {
    (action:UIAlertAction!) -> Void in
    print("キャンセル")
})
//デフォルトアクション(複数指定可能)
let defaultAction = UIAlertAction(title: "デフォルト", style: UIAlertActionStyle.Default, handler: {
    (action:UIAlertAction!) -> Void in
    print("デフォルト")
})
//破壊的アクション(複数指定可能)
let destructiveAction = UIAlertAction(title: "破壊", style: UIAlertActionStyle.Destructive, handler: {
    (action:UIAlertAction!) -> Void in
    print("破壊")
})
alert.addAction(cancelAction)
alert.addAction(defaultAction)
alert.addAction(destructiveAction)
presentViewController(alert, animated: true, completion: nil)

複雑なAction Sheetの表示

ボタンをさらに追加することもできます。

S 2016 06 20 14 31 55 2

複数ボタンが追加できるデフォルトボタン、Destructiveボタンでは、addActionで追加した順番にボタンが表示されます。

let alert = UIAlertController(title: "アクションシート", message: "アクションシートのメッセージです", preferredStyle: UIAlertControllerStyle.ActionSheet)
//キャンセルアクション(1つだけ指定可能)
let cancelAction = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.Cancel, handler: {
    (action:UIAlertAction!) -> Void in
    print("キャンセル")
})
let cancel2Action = UIAlertAction(title: "キャンセル2", style: UIAlertActionStyle.Cancel, handler: {
    (action:UIAlertAction!) -> Void in
    print("キャンセル2")
})
//デフォルトアクション(複数指定可能)
let defaultAction = UIAlertAction(title: "デフォルト", style: UIAlertActionStyle.Default, handler: {
    (action:UIAlertAction!) -> Void in
    print("デフォルト")
})
//デフォルトアクション(複数指定可能)
let default2Action = UIAlertAction(title: "デフォルト2", style: UIAlertActionStyle.Default, handler: {
    (action:UIAlertAction!) -> Void in
    print("デフォルト2")
})
//破壊的アクション(複数指定可能)
let destructiveAction = UIAlertAction(title: "破壊", style: UIAlertActionStyle.Destructive, handler: {
    (action:UIAlertAction!) -> Void in
    print("破壊")
})
let destructive2Action = UIAlertAction(title: "破壊2", style: UIAlertActionStyle.Destructive, handler: {
    (action:UIAlertAction!) -> Void in
    print("破壊2")
})
alert.addAction(cancelAction)
//        alert.addAction(cancel2Action) //これを追加すると「UIAlertController can only have one action with a style of UIAlertActionStyleCancelが発生する。
alert.addAction(defaultAction)
alert.addAction(default2Action)
alert.addAction(destructive2Action)
alert.addAction(destructiveAction)
presentViewController(alert, animated: true, completion: nil)

iPadでAction Sheetを表示する

iPadでAction Sheetを表示する場合追加のコードが必要となります。

IPad

UIAlertControllerからpopoverPresentationControllerを取得しsourceViewとsourceRectに適切に値を設定します。この設定を行わないとクラッシュします。

見た目の形状が吹き出し式に変わっていることにも注目です。

@IBAction func ipadActionSheetTapped(sender: AnyObject) {
    print("iPad用ActionSheetの表示")
    let alert = UIAlertController(title: "アクションシート", message: "アクションシートのメッセージです", preferredStyle: UIAlertControllerStyle.ActionSheet)
    if let popoverPresentationController = alert.popoverPresentationController {
        //iPadの場合sourceViewとsourceRectを設定する必要あり
        print("popoverPresentationController is not nil")
        popoverPresentationController.sourceView = self.view
        popoverPresentationController.sourceRect = sender.frame
    } else {
        //iPhoneの場合はnil
        print("popoverPresentationController is nil")
    }
    
    //キャンセルアクション(1つだけ指定可能)
    let cancelAction = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.Cancel, handler: {
        (action:UIAlertAction!) -> Void in
        print("キャンセル")
    })
    //デフォルトアクション(複数指定可能)
    let defaultAction = UIAlertAction(title: "デフォルト", style: UIAlertActionStyle.Default, handler: {
        (action:UIAlertAction!) -> Void in
        print("デフォルト")
    })
    //破壊的アクション(複数指定可能)
    let destructiveAction = UIAlertAction(title: "破壊", style: UIAlertActionStyle.Destructive, handler: {
        (action:UIAlertAction!) -> Void in
        print("破壊")
    })
    alert.addAction(cancelAction)
    alert.addAction(defaultAction)
    alert.addAction(destructiveAction)
    presentViewController(alert, animated: true, completion: nil)
}