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)を書くことができない