Select SwiftUI 列表中添加了新项目
Select new item added to SwiftUI List
使用 Xcode 11.0,测试版 5。
我有一个 List
由观察视图模型中的模型对象数组驱动。 List
中的每个项目都有一个 NavigationLink
,其目标详细信息 view/view 模型接受该模型作为参数。
用户可以点击列表上方的条形按钮来添加一个新项目,该项目被添加到视图模型的数组中,因此 List
会重新加载显示的新项目。
我无法解决的问题是如何 select 列表中的新项目,从而显示详细视图而不需要用户 select它手动。 (这是一个 iPad 具有分屏视图的应用程序,因此想要 select 它的原因)
我试过以编程方式使用 NavigationLink
,但似乎无法正常工作。我查看了 List
的 selection
参数,但这也要求列表处于编辑模式,所以这不好。
非常欢迎任何建议!
以下解决方案使用 NavigationLink
的 selection
属性。这里的一个问题是只有项目 当前可见 被渲染,所以 select 向下一行没有任何作用。
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
出现。
第三个问题是,在手动 selection 之后,shading
停留在同一项目上,直到再次手动更改。
结果
如果您想 select 尚未初始化的 link(不可见?),程序化 selection 目前还不能真正使用。
进一步的想法
人们可能会多研究一下标签。
另一个选项可以是分页,其中当前页面的所有项目都可见。
也可以使用列表 selection 并显示基于它的详细信息。
使用 Xcode 11.0,测试版 5。
我有一个 List
由观察视图模型中的模型对象数组驱动。 List
中的每个项目都有一个 NavigationLink
,其目标详细信息 view/view 模型接受该模型作为参数。
用户可以点击列表上方的条形按钮来添加一个新项目,该项目被添加到视图模型的数组中,因此 List
会重新加载显示的新项目。
我无法解决的问题是如何 select 列表中的新项目,从而显示详细视图而不需要用户 select它手动。 (这是一个 iPad 具有分屏视图的应用程序,因此想要 select 它的原因)
我试过以编程方式使用 NavigationLink
,但似乎无法正常工作。我查看了 List
的 selection
参数,但这也要求列表处于编辑模式,所以这不好。
非常欢迎任何建议!
以下解决方案使用 NavigationLink
的 selection
属性。这里的一个问题是只有项目 当前可见 被渲染,所以 select 向下一行没有任何作用。
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
出现。
第三个问题是,在手动 selection 之后,shading
停留在同一项目上,直到再次手动更改。
结果
如果您想 select 尚未初始化的 link(不可见?),程序化 selection 目前还不能真正使用。
进一步的想法
人们可能会多研究一下标签。
另一个选项可以是分页,其中当前页面的所有项目都可见。
也可以使用列表 selection 并显示基于它的详细信息。