どういうこと?
@State var isPresented: Bool = false
@State var isAlertOPresented = false
var body: some View {
NavigationView {
// テキトーなViewが書かれている
}
.interactiveDismissDisabled()
.onAppear() {
isPresented = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
isPresented = false
isAlertOPresented = true
}
}
.sheet(isPresented: $isPresented) {
VStack {
ProgressView()
}
.interactiveDismissDisabled()
.dynamicTypeSize(.medium ... .medium)
}
.alert("アラート表示", isPresented: $isAlertOPresented) {
Button("ok") {
}
} message: {
}
}
このような、1秒間ぐるぐるが表示したあと、アラートを表示したいというコードがあったとして、
iOS17では、以下のように遅延を入れないと、sheet→alertが表示されない。
isPresented = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
isPresented = false
DispatchQueue.main.async { // 遅延が必要
isAlertOPresented = true
}
}
遅延なしのコードだと、↓エラーが表示される。
Attempt to present <SwiftUI.PlatformAlertController: 0x105818600> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x10381b000> (from <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x10381b000>) which is already presenting <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x104837400>.
iOS18では、遅延を入れなくてもsheet→alertの順で表示されるようになった。
また、"Attempt to present〜〜〜"のエラーも表示されなくなった。
iOS18からsheetやalertの動きが変わったのかと思ったが、このことについて検索してみたがHitせず。
よくわからんが動くのでヨシ!
とりあえずメモしておく。
なにか知っている方がいたら、コメントください。
検証環境
- Xcode16
- iOS18.0
- iOS17.1.1