Select SwiftUI 列表中添加了新项目

Select new item added to SwiftUI List

使用 Xcode 11.0,测试版 5。

我有一个 List 由观察视图模型中的模型对象数组驱动。 List 中的每个项目都有一个 NavigationLink,其目标详细信息 view/view 模型接受该模型作为参数。

用户可以点击列表上方的条形按钮来添加一个新项目,该项目被添加到视图模型的数组中,因此 List 会重新加载显示的新项目。

我无法解决的问题是如何 select 列表中的新项目,从而显示详细视图而不需要用户 select它手动。 (这是一个 iPad 具有分屏视图的应用程序,因此想要 select 它的原因)

我试过以编程方式使用 NavigationLink,但似乎无法正常工作。我查看了 Listselection 参数,但这也要求列表处于编辑模式,所以这不好。

非常欢迎任何建议!

以下解决方案使用 NavigationLinkselection 属性。这里的一个问题是只有项目 当前可见 被渲染,所以 select 向下一行没有任何作用。

import SwiftUI

struct Item: Identifiable {
    let id = UUID()

    var title: String
    var content: String
}

struct ItemOverview: View {
    let item: Item

    var body: some View {
        Text(item.title)
    }
}

struct ItemDetailsView: View {
    let item: Item

    var body: some View {
        VStack{
            Text(item.title).font(.headline)
            Divider()
            Text(item.content)
            Spacer()
        }
    }
}

func randomString(length: Int) -> String {
    let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    return String((0..<length).map{ _ in letters.randomElement()! })
}

struct ListSelectionView: View {
    @State var items: [Item] = [
        Item(title: "Hello", content: "Content World"),
        Item(title: "Hey", content: "Content Du"),
    ]
    @State var selection: UUID? = nil

    func createItem() {
        let newItem = Item(title: randomString(length: 3), content: randomString(length: 10))
        self.selection = newItem.id
        self.items.append(newItem)
    }

    var body: some View {
        VStack{
            NavigationView{
                List(items) { item in
                    NavigationLink(destination: ItemDetailsView(item: item), tag: item.id, selection: self.$selection, label: {
                        Text(item.title)
                    })
                }
            }
            Button(action: {
                self.createItem()

            }) { Text("Add and select new item") }
            Divider()
            Text("Current selection2: \(String(selection?.uuidString ?? "not set"))")
        }
    }
}

第二个问题是更改 $selection 会使 Modifying state during view update 出现。

第三个问题是,在手动 selection 之后,shading 停留在同一项目上,直到再次手动更改。

结果

如果您想 select 尚未初始化的 link(不可见?),程序化 selection 目前还不能真正使用。

进一步的想法

人们可能会多研究一下标签。

另一个选项可以是分页,其中当前页面的所有项目都可见。

也可以使用列表 selection 并显示基于它的详细信息。