SwiftUIの基本を身につけたい方はこちら

【SwiftUI】コンソールに表示される:SwiftUI encountered an issue when pushing aNavigationLink. Please file a bug.の解決方法

事象

コンソールにて、以下の警告が表示されました。。

SwiftUI encountered an issue when pushing aNavigationLink. Please file a bug.

原因

例えば、以下のようなコードでこの事象が起きます。

このコードは、NavigationLinkとは、別にタップ判定を取得してあれこれしたい時に、以下のようにButton()を作ってisActiveNavigationLinkを呼ぼうとしている時のコードです。

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 エラー)

この一文でしっくり理解できました。

解決方法

NavigationLinkForEachListの外に出すことで、解決できます。

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で囲わないといけません。

評価