使用Xcode 11.0,Beta 5。
我有一个List
,它是由观察视图模型中的一系列模型对象驱动的。 List
中的每个项目都有一个NavigationLink
,其目标详细视图/视图模型接受该模型作为参数。
用户可以点击列表上方的条形按钮以添加一个新项目,该项目将添加到视图模型的数组中,因此List
将重新加载,并显示新项目。
我不能解决的问题是如何选择列表中的新项目,从而显示详细视图而无需用户手动选择它。 (这是一个具有分屏视图的iPad应用,因此选择它的原因)
我尝试以编程方式使用NavigationLink
,但似乎无法正常工作。我查看了selection
的{{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
停留在同一项目上,直到再次手动更改为止。
如果您要选择尚未初始化的链接(不可见?),目前尚无法使用程序选择。
人们可能会更多地关注标签。
另一个选项可能是分页,其中当前页面的所有项目均可见。
一个人也可以使用列表选择并根据该列表显示详细信息。