事象
コンソールにて、以下の警告が表示されました。。
SwiftUI encountered an issue when pushing aNavigationLink. Please file a bug.
原因
例えば、以下のようなコードでこの事象が起きます。
このコードは、NavigationLink
とは、別にタップ判定を取得してあれこれしたい時に、以下のようにButton()
を作ってisActive
でNavigationLink
を呼ぼうとしている時のコードです。
struct ContentView: View { @State var isShowNextView = false var body: some View { NavigationView { ForEach(0..<3, id: \.self) { index in NavigationLink(destination: NextView(), isActive: $isShowNextView) { EmptyView() } Button(action: { isShowNextView = true }) { Text("NextViewの画面へ") } } } } } struct NextView: View { var body: some View { Text("NextView") } }
これで画面遷移するたびに、「SwiftUI encountered an issue when pushing aNavigationLink. Please file a bug.」と表示されてしまいます。
原因は何なのかというと、ForEach
の中にNavigationLink
を入れているのが原因です。(List
の中に入れてもこの事象が発生します。)
ForEachの中でNavigationLinkを行うと繰り返し処理された「isActive」のどれをアクティブ処理するべきか分からなくなってしまうみたい。
引用元:Qiita-(【謎すぎ】SwiftUI encountered an issue when pushing aNavigationLink エラー)
この一文でしっくり理解できました。
解決方法
NavigationLink
をForEach
やList
の外に出すことで、解決できます。
struct ContentView: View { @State var isShowNextView = false var body: some View { NavigationView { VStack { NavigationLink(destination: NextView(), isActive: $isShowNextView) { EmptyView() } ForEach(0..<3, id: \.self) { index in Button(action: { isShowNextView = true }) { Text("NextViewの画面へ") } } } } } }
上記のコードの場合は、EmptyView()
も一応View
なので、VStack
で囲わないといけません。