複数のアラートを表示する方法について記載します。
目次
1. 環境
Xcode : 12.2
Swift : 5
2. 動作
① 保存ボタンをタップすると 1回目のアラートが表示されます。
② 確認メッセージを表示します。OKボタンを押すと次のアラートが表示されます。
③ 2つ目のアラートが表示されます。
3. コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
import SwiftUI struct AlertItem: Identifiable { var id = UUID() var title: Text var message: Text? var dismissButton: Alert.Button? var primaryButton: Alert.Button? var secondaryButton: Alert.Button? } struct ContentView: View { @State private var alertItem: AlertItem? var body: some View { Button(action: { self.alertItem = AlertItem( title: Text("確認メッセージ"), message: Text("保存してもよろしいですか?"), primaryButton: .default(Text("OK"), action: { // OKボタンが押された時の処理 self.alertItem = AlertItem( title: Text("確認メッセージ"), message: Text("処理が完了しました。"), dismissButton: .cancel(Text("OK"))) }) , secondaryButton: .cancel(Text("キャンセル"), action: { // キャンセルボタンが押された時の処理 return }) ) }, label: { Text("保存") .frame(minWidth: 0, maxWidth: .infinity) .padding(20) .overlay(RoundedRectangle(cornerRadius: /*@START_MENU_TOKEN@*/25.0/*@END_MENU_TOKEN@*/).stroke(Color.blue, lineWidth: 3)) }) .alert(item: $alertItem) { alertItem in var alertObj: Alert = Alert( title: alertItem.title, message: alertItem.message, dismissButton: alertItem.dismissButton ) if( alertItem.dismissButton == nil ){ alertObj = Alert( title: alertItem.title, message: alertItem.message, primaryButton: alertItem.primaryButton!, secondaryButton: alertItem.secondaryButton! ) } return alertObj } .background(RoundedRectangle(cornerRadius: 10.0).fill(Color.white)) .padding(20) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } |
4. ポイント
① Alert用の構造体を定義
1 2 3 4 5 6 7 8 |
struct AlertItem: Identifiable { var id = UUID() var title: Text var message: Text? var dismissButton: Alert.Button? var primaryButton: Alert.Button? var secondaryButton: Alert.Button? } |
② Alert構造体の変数を @State で定義
変数に変更があった際にアラートが表示されるようにします。
1 |
@State private var alertItem: AlertItem? |
③ アラートを表示する処理を定義
今回は、シングルボタンとダブルボタンの アラートを表示したかったので、Alert構造体のdismissButtonプロパティに値が設定されているかで、表示するアラートを判定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
.alert(item: $alertItem) { alertItem in var alertObj: Alert = Alert( title: alertItem.title, message: alertItem.message, dismissButton: alertItem.dismissButton ) if( alertItem.dismissButton == nil ){ alertObj = Alert( title: alertItem.title, message: alertItem.message, primaryButton: alertItem.primaryButton!, secondaryButton: alertItem.secondaryButton! ) } return alertObj } |
あとは、次のようにアラートを表示したい任意の場所でAlert構造体を使用して、alertItem変数に代入するだけでアラートが表示されます。
1 |
self.alertItem = AlertItem(・・・) |