なんでなのかよくわからんですが、.alertを複数つけると、正常にアラートが出ない、でも複数必要なので、その対応を実施して記録しておきました。

.alertを複数つけると発火しない?

理由はしらないけど、以下みたいなコードを書いていたら、状態変数がtrueになっても発火しなかった。

コンソールログ上では、trueになっているにも関わらず…だ。

.alert(isPresented: $alertFlag1) {
///何かしら処理
}

.alert(isPresented: $alertFlag2) {
///何かしら処理
}

で、片方を消すときちんと動くわけだ。

ようするに、アラートのモディファイアは1つだけつけて、その中で分岐させてから処理を書く必要があるらしい。

今回やろうとしたのは、例えばアイテムを削除しようとして、

1.削除できた場合
→アラートは出さない
2.削除に失敗した場合
→削除できなかった旨を表示

と、2種類のアラートが必要だったわけ。

削除しますか?と、削除できませんでした の2種類

アラートの中で、どのアラートを出すかを分岐して対応

処理的には以下の流れ。
alertflag → alertにつかう状態変数

alert1 → 最初のアラートを出す場合、trueに
alert2 → 失敗した場合のアラートを出す場合、trueに

こんな感じで実装。失敗した場合のアラートを出す時は、
先にalert2をtrueにしてから、再度alertflagをtrueにする必要がある。

なぜなら、alertflagは、ボタンを押した時点で自動的にfalseになってるので、
再度trueに戻さないといけないが、flagを戻す順番は

alert2 → alertflag

にならないといけないので、alert2をonChangeで監視し、
trueになったのを見計らってalertflagをtrueにする必要がある。

        .onChange(of: alert2){newvalue in

            if newvalue == true{
                alertflag = true
 
            }
            
            
        }
        ///削除用アラート
        .alert(isPresented: $alertflag) {
            
            if alert1 == true{
                
                return Alert(
                    title: Text("削除しますか?"),
                    primaryButton: .destructive(Text("削除")) {
                        ///ここで、いったんアラートは閉じてしまう。
                        ///別のアラートを出す場合、別のアラートが必要なフラグがtrueを確認してから
                        ///再度発火させる必要がある
                            
                            DispatchQueue.main.async{
			////以下の関数で、もし削除が失敗した場合、alert2=trueになる処理が入っている
                                Data.Delete(itemID: itemid)
                 
                            }
                            
                    
                    },
                    secondaryButton: .cancel(Text("キャンセル"))
                )
                
                
            }else if alert2 == true{
                return Alert(
                    title: Text("削除に失敗しました"),
                    message: Text(DeleteMsg),
                    dismissButton: .default(Text("OK")){
                        DispatchQueue.main.async{
			///alerflag,alert1,alert2をすべてfalseにして、終了させる
                            paramReset()
                        }
                        
                    }
                )
                
                
                
            }else{
                
                return Alert(
                    title: Text("その他のエラーが発生しました"),
                    dismissButton: .default(Text("削除")) {
			///alerflag,alert1,alert2をすべてfalseにして、終了させる
                            paramReset()

                    }
                )
            }
            

        }

にしてもですよ。onChangeは変化があった時を検知して処理をする〜みたいなことが教本に書いてあったけど、変数の変更順番を担保する という使い方があるのだなと勉強になったよね。

コメント