LoginSignup
9
11

[SwiftUI] 複数のアラートを管理する方法

Last updated at Posted at 2024-01-29

はじめに

SwiftUIを使用してアプリを開発していると、1つのViewで複数のアラートを表示するとデータが上書きされ、1つのアラートしか表示されなくなります。この問題を対処する方法はいくつかあるみたいですが、今回はアラートの種類をenumで管理する方法を紹介します。

目次

  1. 失敗例
  2. 成功例
  3. さいごに
  4. 参考文献

失敗例

この失敗例では、@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")))
        }
    }
}

RPReplay_Final1706508354.gif

成功例

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")))
            }
        }
    }
}

RPReplay_Final1706508300.gif

さいごに

今回は複数のアラートをenumで管理する方法を紹介しました。
このやり方の他にはViewModifierにタイプとそれに応じたアラートの挙動を定義し、ViewからはそのViewModifierを呼び出せば良いようにする方法もあるみたいですね!

参考文献

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11