【SwiftUI】List内のNavigationLinkの色が元に戻らない

SwiftUI

SwiftUIのListにNavigationLinkを仕込むと、
リンク先から戻った際に色が元に戻らなくなる事がありました。

結論から言うと、VStackでListの上にほかのViewが入ると発生します。
上に他のViewを並べたいときはListの中に入れてしまうのが簡単です。

正常パターン

struct ContentView: View {
    
    var body: some View {
        NavigationView{
            List{
                ForEach(1...5, id:\.self){ num in
                    NavigationLink(destination: LinkDest(tappedNum: num) ){
                        Text( String(num) )
                    }
                    
                }
            }.navigationBarTitle(Text("TestList"))
        }
    }
}


struct LinkDest: View {
    
    let tappedNum: Int
    
    var body: some View{
        Text("Line \(tappedNum) was tapped").font(.title)
    }
}

特になんの工夫もないListなので言う事はありません。

フォーカスが外れない(グレーのまま)パターン

ListをVStackで囲み、上にTextを挿入しました。
これで戻って来た際にタップした箇所がグレーになったままになります。

struct ContentView: View {
    
    var body: some View {
        NavigationView{
            VStack {
                Text("グレーのままになる")
                List{
                    ForEach(1...5, id:\.self){ num in
                        NavigationLink(destination: LinkDest(tappedNum: num) ){
                            Text( String(num) )
                        }
                        
                    }
                }.navigationBarTitle(Text("TestList"))
            }
        }
    }
}

VStackで上にViewを一つ入れるとこうなります。
指定していない場合はListStyleまで変わってしまいます。

複数並べた時の為の機能かと思いきや、上に何かある時だけの挙動です。
Textを下に移動させるとListStyleは変わるもののグレーのままにはなりません。

解決策

TextをListの中に入れてしまえば問題ありません。

struct ContentView: View {
    
    var body: some View {
        NavigationView{
            List{
                Text("元に戻る")
                ForEach(1...5, id:\.self){ num in
                    NavigationLink(destination: LinkDest(tappedNum: num) ){
                        Text( String(num) )
                    }
                    
                }
            }.navigationBarTitle(Text("TestList"))
        }
    }
}

ListStyleも変わってませんね。
見た目はそのままではイマイチかもしれませんが、
この位置に入れるとなると凡そこの形だと思いますし、
TextのModifierで調整すればいい感じに出来ると思います。

SwiftUIは割りとこういう事があり、
ドキュメントをしっかり読み込めば分かるのかもしれませんが、
ざっくり見ただけでは全くわからないので、非常に苦労しています。

コメント

タイトルとURLをコピーしました