
なんでなのかよくわからんですが、.alertを複数つけると、正常にアラートが出ない、でも複数必要なので、その対応を実施して記録しておきました。
追記
そもそも複数つけるんじゃなくて、アラートパターンによって発火させるための引数、item:を使うらしい。
.alert(item: $AlertManager.currentAlertFlag){AlertType in
///AlertTypeによって分岐して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は変化があった時を検知して処理をする〜みたいなことが教本に書いてあったけど、変数の変更順番を担保する という使い方があるのだなと勉強になったよね。