Closed3
SwiftUI困りごと
SwiftUIで実装している時に困ったことリスト
一応ワークアラウンド的なもので一時的な解決はさせているが、本質的ではないのでここにまとめていく
何かアドバイス等ありましたらお気軽にコメントいただけると嬉しいです
一定条件下で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])
}
}
}
NavigationBarItemsの中にNavigationLinkを置いた時の挙動
条件:
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にクローズされました