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

标签 ios swift swiftui

使用 Xcode 11.0,Beta 5。

我有一个 List 由观察到的 View 模型中的模型对象数组驱动。 List 中的每个项目都有一个 NavigationLink,其中包含接受模型作为参数的目标详细 View / View 模型。

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

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

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

非常欢迎任何建议!

最佳答案

以下解决方案使用 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 出现。

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

结果

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

进一步的想法

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

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

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

关于ios - 选择添加到 SwiftUI 列表的新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526191/

相关文章:

ios - 将 UIRefreshControl 替换为 UIImageView

Swift ENUMS - 为什么它对我大喊大叫,要求我在枚举初始值设定项中隐式展开?这逼着我

swift - 如何将 UIImage 转换为 CVPixelBuffer

swiftui - Xcode beta中的NavigationStack的navigationDestination无法导航

ios - Swift 3 错误处理和变量可访问性

ios - 在 iOS 中处理框架的方向

ios - 是否可以在 iOS 14+ 中禁用后退导航菜单?

ios - 使用私有(private) API 强制 iOS 应用程序在前台打开

swiftui - VStack 围绕图像间距,但不围绕文本

list - SwiftUI - 两个独立的按钮合二为一