次のコードがあります:
@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())
}
}
次の出力が印刷されます。
- サインアウトボタンがクリックされました
- .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"))
}
}
}
}