Ios 选择添加到SwiftUI列表的新项目
使用Xcode 11.0,Beta 5 我有一个Ios 选择添加到SwiftUI列表的新项目,ios,swift,swiftui,Ios,Swift,Swiftui,使用Xcode 11.0,Beta 5 我有一个列表,它是从观察到的视图模型中的一组模型对象驱动的。列表中的每个项都有一个NavigationLink,其中包含一个接受模型作为参数的目标详细视图/视图模型 用户可以点击列表上方的条形按钮添加一个新项目,该项目将添加到视图模型的数组中,列表因此会重新加载,并显示新项目 我无法解决的问题是如何在列表中选择新项目,从而显示详细视图,而不需要用户手动选择。(这是一款具有分屏视图的iPad应用程序,因此需要选择它) 我尝试过以编程方式使用Navigatio
列表
,它是从观察到的视图模型中的一组模型对象驱动的。列表中的每个项都有一个NavigationLink
,其中包含一个接受模型作为参数的目标详细视图/视图模型
用户可以点击列表上方的条形按钮添加一个新项目,该项目将添加到视图模型的数组中,列表
因此会重新加载,并显示新项目
我无法解决的问题是如何在列表中选择新项目,从而显示详细视图,而不需要用户手动选择。(这是一款具有分屏视图的iPad应用程序,因此需要选择它)
我尝试过以编程方式使用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"))")
}
}
}
导入快捷界面
结构项:可识别{
设id=UUID()
变量标题:字符串
变量内容:字符串
}
结构项概述:视图{
让项目:项目
var body:一些观点{
文本(项目名称)
}
}
结构项详细信息视图:视图{
让项目:项目
var body:一些观点{
VStack{
文本(item.title).font(.headline)
分隔器()
文本(项目.内容)
垫片()
}
}
}
func randomString(长度:Int)->String{
let letter letters=“ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789”
返回字符串((0..正如您所提到的,这在性能方面并不理想,并且我有一些问题,但它确实似乎是这样做的预期方式。希望在我们走向通用汽车的过程中,一些问题会得到解决。感谢您的帮助!