はじめに
SwiftUIを使用してアプリを開発していると、1つのViewで複数のアラートを表示するとデータが上書きされ、1つのアラートしか表示されなくなります。この問題を対処する方法はいくつかあるみたいですが、今回はアラートの種類をenumで管理する方法を紹介します。
目次
失敗例
この失敗例では、@Stateを使用してアラートの表示状態を管理していますが、複数のアラートが同時に表示されるとデータが上書きされ、期待した動作になりません。
import SwiftUI
struct SampleView: View {
// エラーアラートの表示状態を監視
@State private var showErrorAlert = false
// 成功アラートの表示状態を監視
@State private var showSuccessAlert = false
var body: some View {
VStack(spacing: 50) {
Text("失敗例")
Button("エラーアラートを表示") {
self.showErrorAlert = true
}
Button("成功アラートを表示") {
self.showSuccessAlert = true
}
}
// このアラートは表示されない(下のアラートに上書きされるため)
.alert(isPresented: $showErrorAlert) {
Alert(title: Text("エラー"), message: Text("何か問題が発生しました。"), dismissButton: .default(Text("OK")))
}
// このアラートは表示される
.alert(isPresented: $showSuccessAlert) {
Alert(title: Text("成功"), message: Text("操作が正常に完了しました。"), dismissButton: .default(Text("OK")))
}
}
}
成功例
enumを使用してアラートの種類を管理し、それに基づいてアラートを表示しています。これにより、複数のアラートを独立して管理することができ、データの上書きを防ぐことができます。
import SwiftUI
// アラートの種類を表すenum
enum AlertType: Identifiable {
case error
case success
var id: AlertType { self }
}
struct SampleView: View {
@State private var currentAlert: AlertType?
var body: some View {
VStack(spacing: 50) {
Text("成功例")
Button("エラーアラートを表示") {
self.currentAlert = .error
}
Button("成功アラートを表示") {
self.currentAlert = .success
}
}
// アラートのモディファイアを1つにすることでどちらも表示される
.alert(item: $currentAlert) { alertType in
switch alertType {
case .error:
return Alert(title: Text("エラー"), message: Text("何か問題が発生しました。"), dismissButton: .default(Text("OK")))
case .success:
return Alert(title: Text("成功"), message: Text("操作が正常に完了しました。"), dismissButton: .default(Text("OK")))
}
}
}
}
さいごに
今回は複数のアラートをenumで管理する方法を紹介しました。
このやり方の他にはViewModifierにタイプとそれに応じたアラートの挙動を定義し、ViewからはそのViewModifierを呼び出せば良いようにする方法もあるみたいですね!