在iOS 16中使用新的NavigationLink API防止嵌套SwiftUI列表中的自动选择突出显示

ajsxfq5m  于 2023-03-31  发布在  iOS
关注(0)|答案(1)|浏览(204)

这是在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吗?

dbf7pr2w

dbf7pr2w1#

在我看来,这是SwiftUI中的一个错误,没有更好地清除视图状态。我希望这个问题能够自行解决,因为那些包含List的视图变得更加复杂,以至于视图或视图状态不会意外地在幕后回收。如果没有,请将反馈放在这里!

相关问题