选择添加到 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
,但似乎无法正常工作。我查看了List
的selection
参数,但这也要求列表处于编辑模式,所以这不好。
非常欢迎任何建议!
【问题讨论】:
【参考方案1】:以下解决方案使用NavigationLink
的selection
属性。这里的一个问题是,只有 当前可见 的项目会被渲染,因此选择更下方的一行不会执行任何操作。
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 如何创建一个将项目添加到包含导航链接的列表的按钮