iOS8でのダイアログ表示：廃止になるUIAlertViewと推奨されているUIAlertControllerのメリット


iOSでダイアログ表示用のクラスUIAlertViewがiOS8からdeprecatedになるため、
UIAlertViewを使用した際の挙動と推奨されているUIAlertControllerについてまとめました。

(本記事の内容は[一般公開されているiOS8の情報](https://developer.apple.com/library/prerelease/iOS/navigation/)に基づいています。
iOS8に関するスクリーンショットは掲示していません。)

#iOS8で廃止されるUIAlertViewを使用した際の挙動
deprecatedされたメソッドを使用した場合、アプリが落ちるなどの問題が発生することがありますが、
iOS8 beta2の環境ではシミュレータ・実機ともに問題なく表示できます。
2014/6/24現在では継続してUIAlertViewを使用したままでも問題無いようです。
上記の内容はObjective-Cに関してであり、Swift(iOS8)ではEXC_BAD_ACCESSでアプリが落ちます。

公式にdeprecatedと宣言されているため挙動が変わる可能性は否定できません。
推奨されているUIAlertControllerへの移行をおすすめします。

#推奨されているUIAlertControllerのメリット
iOS8以降で利用が推奨されているUIAlertControllerのメリットの１つとして、
レイアウトの自由な変更ができます。

iOS7までのUIAlertViewでは左にcancelボタン、右にotherボタンが配置されていました。
またcancelボタンの文字はBoldのフォントで表示されていました。

![iOS7_AlertView.jpg](https://qiita-image-store.s3.amazonaws.com/0/34488/a2fc85db-c59f-4f1d-448f-3f4f7e5d0158.jpeg)

（「はい」「いいえ」を逆に表示させたい場合はコード上で指定を逆にして
表示させていた方もいらっしゃるでしょう。）

新しいUIAlertControllerでは左右どちらに何のボタンを配置するのか任意に決められます。
さらにボタンのフォントを以下の３つの中から選ぶことができます。

* UIAlertActionStyleDefault：標準
* UIAlertActionStyleCancel：Bold表示
* UIAlertActionStyleDestructive：文字色が赤色

また - addTextFieldWithConfigurationHandler:を使用することでダイアログ内にTextFieldを挿入させることができます。


#iOS7以前のOSをサポートする際の注意点
開発中のアプリの中にはiOS7以前をサポートするアプリもあるかと思います。
そのためにはUIAlertViewとUIAlertControllerをコード内で併用して使い分けることが必要です。

その際にボタンが押された時の処理に注意してください。
UIAlertViewではdelegateメソッドで処理しますが、
UIAlertControllerはクロージャで処理します。

UIAlertViewとUIAlertControllerを併用する際にはボタンが押された時のメソッドを作成して、
そのメソッドを両者で使い回すことをオススメします。

#サンプルコード
##UIAlertController

###Objective-C
```objc:UIAlertController

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"UIAlertControllerStyle.Alert" message:@"iOS8" preferredStyle:UIAlertControllerStyleAlert];

// addActionした順に左から右にボタンが配置されます
[alertController addAction:[UIAlertAction actionWithTitle:@"はい" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    // otherボタンが押された時の処理                                                      
    [self otherButtonPushed];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"いいえ" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    // cancelボタンが押された時の処理                                                      
    [self cancelButtonPushed];
}]];

[self presentViewController:alertController animated:YES completion:nil];

- (void)cancelButtonPushed {}
- (void)otherButtonPushed {}

```

##UIAlertView (deprecated in iOS8)



```objc
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"AlertView" 
                                                    message:@"iOS7"
                                                    delegate:self
                                                    cancelButtonTitle:@"いいえ"
                                                    otherButtonTitles:@"はい", nil];
[alertView show];

...

-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  switch (buttonIndex) {
    case 0:
      // cancelボタンが押された時の処理
      [self cancelButtonPushed];
      break;
    case 1:
      // otherボタンが押されたときの処理
      [self otherButtonPushed];
      break;
  }
}

- (void)cancelButtonPushed {} 
- (void)otherButtonPushed {} 

```

### Swift
```swift:UIAlertController

var alertController = UIAlertController(title: "UIAlertControllerStyle.Alert", message: "iOS8", preferredStyle: .Alert)

let otherAction = UIAlertAction(title: "はい", style: .Default) {
    action in NSLog("はいボタンが押されました")
}
let cancelAction = UIAlertAction(title: "いいえ", style: .Cancel) {
    action in NSLog("いいえボタンが押されました")
}

// addActionした順に左から右にボタンが配置されます
alertController.addAction(otherAction)        
alertController.addAction(cancelAction)
        
presentViewController(alertController, animated: true, completion: nil)

```

#参考
公式Class Reference
https://developer.apple.com/library/prerelease/iOS/documentation/UIKit/Reference/UIAlertController_class/index.html#//apple_ref/occ/cl/UIAlertController