1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[SwiftUI]actionやalertを2つ連続して使うときのハマりどころ

Posted at

SwiftUIで.action.sheetを使うときに、ハマってしまって時間を浪費してしまいました。その解決策のメモです。

どのような問題か

下記のように.alertを2つつなげた場合、後のalertしか表示されませんでした。

struct ContentView: View {
    
    @State var presentAlert1: Bool = false
    @State var presentAlert2: Bool = false
    
    var body: some View {
        VStack(spacing: 32) {
            Button.init("アラート1") {
                self.presentAlert1.toggle()
            }
            Button.init("アラート2") {
                self.presentAlert2.toggle()
            }
        }
        .alert(isPresented: $presentAlert1) {
            Alert.init(title: Text("アラート1"))
        }
        .alert(isPresented: $presentAlert2) {
            Alert.init(title: Text("アラート2"))
        }
    }
}

また、下記の場合も1つ目のalertが表示されませんでした。

struct ContentView: View {
    
    @State var presentAlert1: Bool = false
    @State var presentAlert2: Bool = false
    
    var body: some View {
        VStack(spacing: 32) {
            Button.init("アラート1") {
                self.presentAlert1.toggle()
            }
            .alert(isPresented: $presentAlert1) {
                Alert.init(title: Text("アラート1"))
            }
            Button.init("アラート2") {
                self.presentAlert2.toggle()
            }
        }
        .alert(isPresented: $presentAlert2) {
            Alert.init(title: Text("アラート2"))
        }
    }
}

解決方法

以下のように、それぞれのButtonにalert(またはsheet)をつけます。

struct ContentView: View {
    
    @State var presentAlert1: Bool = false
    @State var presentAlert2: Bool = false
    
    var body: some View {
        VStack(spacing: 32) {
            Button.init("アラート1") {
                self.presentAlert1.toggle()
            }
            .alert(isPresented: $presentAlert1) {
                Alert.init(title: Text("アラート1"))
            }
            Button.init("アラート2") {
                self.presentAlert2.toggle()
            }
            .alert(isPresented: $presentAlert2) {
                Alert.init(title: Text("アラート2"))
            }
        }
    }
}

まとめ

  • 連続してalertを書くことはできない(sheetも同様)
  • 親Viewにalertがある場合、子Viewにalert(もしくはsheet)を書くことができない
1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?