Closed3

SwiftUI困りごと

aphanantheaphananthe

SwiftUIで実装している時に困ったことリスト
一応ワークアラウンド的なもので一時的な解決はさせているが、本質的ではないのでここにまとめていく
何かアドバイス等ありましたらお気軽にコメントいただけると嬉しいです

aphanantheaphananthe

一定条件下でListのハイライトが消えない問題

条件: VStackの中にListを入れて、Listの真上に何かしらのViewを置く
操作: NavigationLinkで次のViewに遷移後、戻る
結果: Listで選択していたセルのハイライトが消えないで残ったまま

ContentView.swift
import SwiftUI

struct ContentView: View {
    private var words = ["Hello", "World", "Hi"]
    
    var body: some View {
        NavigationView {
            VStack {
                Text("VStackの中にListを入れる")
                List {
                    ForEach(0..<words.count) { word in
                        ZStack {
                            NavigationLink(destination: NextView()) {
                                EmptyView()
                            }
                            .opacity(0)
                            .buttonStyle(PlainButtonStyle())
                            Text(words[word])
                        }
                    }
                }
                .listRowBackground(Color.blue)
                .listStyle(PlainListStyle())
            }
        }
    }
}

こんな感じでハイライトが残ったまま↓

ワークアラウンド:
空のボタンを配置する
これで一応ハイライトは残らない

List {
    ForEach(0..<words.count) { word in
        ZStack {
            Button("") {} // ここに空のボタンを置く
            NavigationLink(destination: NextView()) {
                EmptyView()
            }
            .opacity(0)
            .buttonStyle(PlainButtonStyle())
            Text(words[word])
         }
    }
}
aphanantheaphananthe

条件:
NextViewのNavigationBarItemsにNavigationLinkを置く
操作:
ContentView -> NextView -> ThirdView と遷移する
結果:
ThirdViewからスワイプで前のViewに戻ろうとすると、1個前のNextViewではなくContentViewに遷移する
あとなんかNavigationLink押した時のアニメーションも働かない

ContentView.swift
import SwiftUI

struct ContentView: View {
    
    @State var showView = false
    
    var body: some View {
        NavigationView {
            NavigationLink(destination: NextView()) {
                Text("Next")
            }
        }
    }
}
NextView.swift
import SwiftUI

struct NextView: View {
    var body: some View {
        Text("SecondView")
            .navigationBarItems(trailing: NavigationLink(destination: ThirdView()) {
                Text("Button")
            })
    }
}
ThirdView.swift
import SwiftUI

struct ThirdView: View {
    var body: some View {
        Text("ThirdView")
    }
}

ワークアラウンド:
以下のように書くと問題なく1つ前のViewに戻るようになるし、アニメーションもちゃんと働く
Developer Forumsと同じ問題だと思うけどクラッシュはしない...

NextView.swift
import SwiftUI

struct NextView: View {
    @State private var showThirdView = false
    
    var body: some View {
        NavigationLink(destination: ThirdView(), isActive: $showThirdView) {
            EmptyView()
        }
        .frame(width: 0, height: 0)
        .disabled(true)
        Text("SecondView")
            .navigationBarItems(trailing: Button(action: {
                showThirdView = true
            }, label: {
                Text("ThiidView")
            }))
    }
}
このスクラップは2023/11/14にクローズされました