(2021/09/22 更新)
画面遷移時にアラートが表示されない不具合に遭遇したので、記録を残しておきます。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】12.5RC
【Swift】5.4
【iOS】14.5
【macOS】Big Sur バージョン 11.1
【Swift】5.4
【iOS】14.5
【macOS】Big Sur バージョン 11.1
問題の現象
iOS14.5で次のコードを実行すると、アラートが表示されずにエラーログが出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import SwiftUI struct ContentView: View { var body: some View { NavigationView { List { NavigationLink(destination: NextView()) { Text("Next View") } } } } } struct NextView: View { @State private var showingAlert = false var body: some View { Text("Next View") .alert(isPresented: $showingAlert) { Alert(title: Text("Alert!")) } .onAppear { showingAlert = true } } } |
エラーログ
1 2 3 |
2021-05-18 06:03:29.719113+0900 SampleProject12.5[3501:292194] [Presentation] Attempt to present <SwiftUI.PlatformAlertController: 0x7fa2e4872400> on <_TtGC7SwiftUI41StyleContextSplitViewNavigationControllerVS_14NoStyleContext_: 0x7fa2e581ee00> (from <_TtGC7SwiftUIP13$7fff5695965428DestinationHostingControllerVS_7AnyView_: 0x7fa2e3f245f0>) whose view is not in the window hierarchy. |
原因と対処方法
条件としてはList+navigationLinkで遷移した後に.onAppearでアラートを表示しようとすると発生します。
遷移した画面のViewの階層構造が作られる前にアラートを描画しようして失敗しているようです。
同じコードをiOS14.4で実行すると、アラートが表示されるので、iOS14.5でなんらかの変更があったと思われます。
対処として、次のようにアラートの表示部を非同期キューに入れてやると正常に動作します。
1 2 3 4 5 6 7 |
.onAppear { DispatchQueue.main.async { showingAlert = true } } |
参考リンク
この問題を解決する為にAppleのDeveloppers Forumに質問した内容です。
なお、記事中で「iOS4.5」となっているのは、「iOS14.5」の間違いです。(^^;
Problem with alert in iOS4.5 | Apple Developer Forums
あわせて読みたい記事
(アーカイブ)【SwiftUI】アラートの使い方(alert)
(2020/8/13 更新) 本記事の説明はiOS14以前の使用方法です。iOS15以降の情報はこちらの記事を御覧ください。 ユーザーに確認を促すアラートダイアログを表示する、.alert()の使い方について解説します。
【SwiftUI】Listの使い方
(2022/03/09 更新) Listはデータの一覧表示をするのに適したViewです。 画面に収まらない量の場合はスクロール表示になるなど、UIKitのUITableViewに似ていますが、はるかに簡単に使えます。 ListはForEac...
(アーカイブ)【SwiftUI】NavigationViewでの画面遷移
(2020/11/8 更新) 本記事で使用しているNavigationViewはiOS16以降では非推奨となっています。 最新の情報はこちらの記事を御覧ください。 NavigationView配下での画面遷移について解説します。