Tech / 2026.01.10
/
更新: 2026.01.10 / 4 分 / ...
完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
S7r1n9y
Engineer
完全に理解する Storyboard & UIKit
22 / 30 移動 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
移動 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Sponsored
完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
「データの削除前に確認したい」「カメラを起動するか、アルバムを開くか選択させたい」 アプリ開発では、メインの画面遷移とは別に「ユーザーへ注意を促す」あるいは「選択肢を提示する」ための一時的なポップアップUIが不可欠です。
UIKitでは、これらを全て UIAlertController という単一のクラスで表現します。これはStoryboardを使わず、完全にコードのみで生成・表示 します。
1. UIAlertController の2つのスタイル(Style)
UIAlertController には表示形式を決める .preferredStyle が2種類あります。
.alert(アラート)- 画面の中央に表示されるダイアログです。
- 「はい / いいえ」の確認や、エラーメッセージの表示など、ユーザーに短い選択文字や決定を迫る(作業を中断させる)場合に使用します。
.actionSheet(アクションシート)- 画面の下部からせり上がってくるメニューです(iPadの場合はポップオーバーになります)。
- 3つ以上の複数の選択肢(例: 「カメラ」「ライブラリ」「キャンセル」)を並べる場合など、ユーザーにアクションを選ばせる場合に使用します。
2. アラート (.alert) の実装手順
標準的な「タイトル」「メッセージ」「OK/キャンセルボタン」を持つアラートを作ります。
swift@IBAction func deleteButtonTapped(_ sender: UIButton) { // 1. コントローラーの初期化(スタイルは .alert) let alert = UIAlertController(title: "データ削除", message: "本当にこのデータを削除してもよろしいですか?この操作は取り消せません。", preferredStyle: .alert) // 2. ボタン(Action)を作成する // OKボタン(style: .destructive にすると文字が赤くなり警告を意味する) let deleteAction = UIAlertAction(title: "削除する", style: .destructive) { (action) in // OKボタンが押された時の処理をここに書く print("データが削除されました。") } // キャンセルボタン(style: .cancel は常にアラートの左側/下側に配置され、太字になる) let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel) { (action) in print("キャンセルされました。") } // 3. コントローラーにボタンを追加する alert.addAction(cancelAction) // 追加する順序に注意(普通はキャンセルを先に書くと左に配置される) alert.addAction(deleteAction) // 4. アラートを画面に表示する(Present) self.present(alert, animated: true, completion: nil) }
👉 UIAlertAction の Style(スタイル)
.default: 通常の青いテキスト。.cancel: キャンセル用。太字になり、ActionSheetでは一番下に分離して配置されます**(必ず1つだけ追加可能)**。.destructive: 削除やログアウトなど、危険な操作用。赤いテキストになります。
3. アクションシート (.actionSheet) の実装手順
下からメニューがせり上がるアクションシートの作り方も、初期化のスタイルを変えるだけで基本的な流れは全く同じです。
swift@IBAction func showMenuButtonTapped(_ sender: UIButton) { // スタイルを .actionSheet に変更 let actionSheet = UIAlertController(title: "写真を選択", message: nil, // メッセージ不要ならnil preferredStyle: .actionSheet) // 選択肢を追加 let cameraAction = UIAlertAction(title: "カメラで撮影", style: .default) { _ in print("カメラ起動") } let libraryAction = UIAlertAction(title: "ライブラリから選ぶ", style: .default) { _ in print("ライブラリ起動") } // キャンセルボタン(自動的に一番下に分離してめ目立つように配置されます) let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil) actionSheet.addAction(cameraAction) actionSheet.addAction(libraryAction) actionSheet.addAction(cancelAction) // iPadでのクラッシュ対策(超重要!※後述) actionSheet.popoverPresentationController?.sourceView = sender actionSheet.popoverPresentationController?.sourceRect = sender.bounds // 表示 self.present(actionSheet, animated: true, completion: nil) }
⚠️ iPadでActionSheetを表示する際の注意点
iPhoneでは下からせり上がるActionSheetですが、iPadの広い画面では「どのボタンから吹き出し(ポップオーバー)として出現するか?」をシステムに教えてあげないと、アプリがクラッシュ(強制終了)します。
そのため、上記のコード内にあるように popoverPresentationController?.sourceView 等に対して「発生源のビュー(タップされたボタンなど)」を指定するおまじないが必須になります。
📝 今日のまとめ
- アラートとアクションシートは、共に
UIAlertControllerを用いてコードから生成・表示(present)する。 - 中央のダイアログは
.alert、下部からのメニューは.actionSheetを指定する。 - ボタンは
UIAlertActionを生成してaddActionで追加する。 - ボタンのスタイル(
.default,.cancel,.destructive)を使い分けてUXを向上させる。 - ActionSheetを使う場合は、iPadでのクラッシュを防ぐために
popoverPresentationControllerの設定を忘れない。
アプリ開発で絶対に避けては通れないポップアップUIをマスターしました。 明日の Day 23 では、ユーザーに「日付」や「都道府県」のような固定リストから値を選択させるコンポーネント、UIDatePicker と UIPickerView の実装方法を学びます。
END OF FILE
この記事は役に立ちましたか?
SNSでシェアする
後で読む(ブックマーク)
完全に理解する Storyboard & UIKit
22 / 30 移動 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
移動 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Related Articles
Tech
完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
2026.01.14Tech
完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
2026.01.11Tech
完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
2025.12.30Tech