选择添加到 SwiftUI 列表的新项目

Posted

技术标签:

【中文标题】选择添加到 SwiftUI 列表的新项目【英文标题】:Select new item added to SwiftUI List 【发布时间】:2019-08-16 14:14:27 【问题描述】:

使用 Xcode 11.0,测试版 5。

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

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

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

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

非常欢迎任何建议!

【问题讨论】:

【参考方案1】:

以下解决方案使用NavigationLinkselection 属性。这里的一个问题是,只有 当前可见 的项目会被渲染,因此选择更下方的一行不会执行任何操作。

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 出现。

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

结果

如果您想选择一个尚未初始化的链接(不可见?),程序化选择目前还不能真正使用。

进一步的想法

人们可能会更多地研究标签。

另一个选项可能是在当前页面的所有项目都可见的地方进行分页。

也可以使用列表选择并基于此显示详细信息。

【讨论】:

正如您所提到的,这在性能方面并不理想,并且存在一些问题,但它确实似乎是这样做的预期方式。希望随着我们向通用汽车迈进,一些问题将得到解决。感谢您的帮助!

以上是关于选择添加到 SwiftUI 列表的新项目的主要内容,如果未能解决你的问题,请参考以下文章

取消选择 SwiftUI 列表中的项目会使应用程序崩溃

如何在 swiftUI 中选择项目时在选择器上添加操作?

SwiftUI 如何创建一个将项目添加到包含导航链接的列表的按钮

SwiftUI:选择列表中的项目后更新数据

在 swiftUI 列表中添加、选择和删除文件名 - MacOS

如何使用 SwiftUI 将值数组写入 Firestore