这是在Xcode 14.2和iOS 16.2
我正在开发一个带有嵌套列表和导航的SwiftUI应用程序。我已经写了一个基本的例子来演示这个问题。结构如下:
1.主视图有一个项目列表(类型Item)。
1.单击项目可导航到详细信息视图。
1.详细视图有一个按钮,可导航到另一个项目列表(相同类型的项目)。
1.当您导航到此列表时,其中一个项目已经突出显示/选中(可能是因为它继承了上一个列表中的选择??)
编码演示的问题
import SwiftUI
struct Item: Hashable, Identifiable {
let id: Int
let thing: String
}
struct TopLevel: View {
var body: some View {
NavigationStack {
// uncomment one or the other to test
Programmatic_NavLink() // I need to use this, but it has this weird selection behavior/bug??
//Old_NavLink() // this does what I want but I need to be able to use value based navigation
}
}
}
struct Programmatic_NavLink: View {
let myItems = [Item(id: 1, thing: "thing 1"), Item(id: 2, thing: "thing 2"), Item(id: 3, thing: "thing 3")]
var body: some View {
List(myItems) { item in
NavigationLink(item.thing, value: item)
}
.navigationDestination(for: Item.self) { item in
Details(style: "programmatic")
}
.navigationDestination(for: Int.self) { num in
Programmatic_NavLink()
}
}
}
struct Old_NavLink: View {
let myItems = [Item(id: 1, thing: "thing 1"), Item(id: 2, thing: "thing 2"), Item(id: 3, thing: "thing 3")]
var body: some View {
List(myItems) { item in
NavigationLink(item.thing) {
Details(style: "classic")
}
}
}
}
struct Details: View {
let style: String
var body: some View {
if style == "programmatic" {
NavigationLink("Demo", value: 5)
} else {
NavigationLink("Demo", destination: Old_NavLink())
}
}
}
struct TestNavStack_Previews: PreviewProvider {
static var previews: some View {
TopLevel()
}
}
如果你使用经典的导航链接,它就不会这样了。我希望列表彼此完全独立,尽管它们可能包含一个与前一个列表中的一个相同的项目。我已经尝试在我的列表中添加一个$selection输入,它被显式设置为nil,但这有一个副作用,那就是导航链接完全不起作用。我也试过传递显式设置为nil的绑定作为选择值,但它也有同样的问题。我只会使用经典的导航链接API,但我需要能够使用基于值的导航链接的其他原因。
有没有人知道如何修复这个问题?这是一个bug吗?
1条答案
按热度按时间dbf7pr2w1#
在我看来,这是SwiftUI中的一个错误,没有更好地清除视图状态。我希望这个问题能够自行解决,因为那些包含
List
的视图变得更加复杂,以至于视图或视图状态不会意外地在幕后回收。如果没有,请将反馈放在这里!