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

时间:2019-08-16 14:14:27

标签: ios swift swiftui

使用Xcode 11.0,Beta 5。

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

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

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

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

任何建议都非常欢迎!

1 个答案:

答案 0 :(得分:1)

以下解决方案使用selection的{​​{1}}属性。这里的一个问题是,只有当前可见的项被渲染,因此选择更下方的行将无济于事。

NavigationLink

第二个问题是,更改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停留在同一项目上,直到再次手动更改为止。

结果

如果您要选择尚未初始化的链接(不可见?),目前尚无法使用程序选择。

其他想法

人们可能会更多地关注标签。

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

一个人也可以使用列表选择并根据该列表显示详细信息。