SwiftUI でアラートを表示する際の問題 – アラート ボックスが表示されない 質問する

SwiftUI でアラートを表示する際の問題 – アラート ボックスが表示されない 質問する

次のコードがあります:

@State private var signoutAlert = false

var body: some View {

    Button(action: {
      
        self.signoutAlert = true
        
        print("signout button clicked")
        
    }) {
        
        Text("Sign Out")
    
    }
    .alert(isPresented: $signoutAlert) {
        
        print(".alert will display")
        //
        return Alert(title: Text("Sign Out"), message: Text("Are you sure you want to Sign Out?"), primaryButton: .destructive(Text("Sign Out")) {
            
            print("Signing out....")
          
            self.session.signOut()

            self.presentationMode.wrappedValue.dismiss()
            
        }, secondaryButton: .cancel())
    
    }

}

次の出力が印刷されます。

  1. サインアウトボタンがクリックされました
  2. .alertが表示されます

アラート ボックスが表示され、ユーザーに 2 つのボタンのいずれかをクリックして「キャンセル」または「サインアウト」するよう求めるプロンプトが表示されることを期待していますが、アラート ボックスは表示されず、ユーザーにプロンプ​​トも表示されません。これは意味がありません。

私のコードに何か問題があると気づいた人はいませんか?非常にシンプルなはずなのに、非常にイライラします。

ベストアンサー1

ビュー階層のさらに上のビューに .alert(...) ビュー修飾子がある場合に、この問題が発生しました。親ビューに .alert() が定義されている場合、子の .alert() 修飾子ではアラートが表示されません。

私の場合、高レベルビューの .alert() を、それをトリガーしたボタンの修飾子に移動したところ、両方のアラートが正しく表示されるようになりました。例:

struct HiddenWalrusView: View {
    @State private var showAlert1 = false
    @State private var showAlert2 = false
    
    var body: some View {
        VStack {
            Button("Show Alert One") { showAlert1 = true }
                .padding(20)
            Button("Show Alert Two") { showAlert2 = true }
                .padding(20)
                .alert(isPresented: $showAlert2) {
                    // This alert never displays
                    Alert(title: Text("I am the Walrus"))
                }
        }
        .alert(isPresented: $showAlert1) {
            Alert(title: Text("I am the Egg Man"))
        }
    }
}

struct EggmanAndWalrusView: View {
    @State private var showAlert1 = false
    @State private var showAlert2 = false
    
    var body: some View {
        VStack {
            Button("Show Alert One") { showAlert1 = true }
                .padding(20)
                .alert(isPresented: $showAlert1) {
                    Alert(title: Text("I am the Egg Man"))
                }
            Button("Show Alert Two") { showAlert2 = true }
                .padding(20)
                .alert(isPresented: $showAlert2) {
                    Alert(title: Text("I am the Walrus"))
                }
        }
    }
}

おすすめ記事