事象
コンソールにて、以下の警告が表示されました。。
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で囲わないといけません。

