使用 Xcode 11.0,Beta 5。
我有一个 List
由观察到的 View 模型中的模型对象数组驱动。 List
中的每个项目都有一个 NavigationLink
,其中包含接受模型作为参数的目标详细 View / View 模型。
用户可以点击列表上方的条形按钮来添加一个新项目,该项目被添加到 View 模型的数组中,因此 List
会重新加载显示的新项目。
我无法解决的问题是如何选择列表中的新项目,从而显示详细 View 而不需要用户手动选择它。 (这是一个具有分屏 View 的 iPad 应用程序,因此选择它的原因)
我尝试过以编程方式使用 NavigationLink
,但似乎无法正常工作。我查看了 List
的 selection
参数,但这也要求列表处于编辑模式,所以这不好。
非常欢迎任何建议!
最佳答案
以下解决方案使用 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
出现。
第三个问题是,在手动选择之后,阴影
一直停留在同一个项目上,直到再次被手动更改。
结果
如果您想选择一个尚未初始化的链接(不可见?),程序化选择目前还不能真正使用。
进一步的想法
人们可能会多研究一下标签。
另一个选项可以是分页,其中当前页面的所有项目都可见。
也可以使用列表选择并基于此显示详细信息。
关于ios - 选择添加到 SwiftUI 列表的新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526191/