ios - 显示数组的 SwiftUI 列表未更新
问题描述
在我的 SwiftUI 应用程序中,有一个列表显示数组中的所有项目。当我单击一个项目时,会显示其详细信息并且可以对其进行修改。这些更改存储在数组中,但是当我返回列表视图时,这些更改仅在我对该列表数组进行更改后才会反映出来,例如添加或移动项目。当它重新出现时,我可以让这个列表刷新吗?
我的主视图如下所示:
import SwiftUI
struct ContentView: View {
@State var items: [Item]
var body: some View {
NavigationView {
List {
ForEach(items) { item in
NavigationLink(destination: ItemDetailView(items: self.$items, index: self.items.firstIndex(of: item)!)) {
HStack {
VStack(alignment: .leading) {
Text(item.name).font(.title)
if item.serialNumber != nil {
Text(item.serialNumber!)
.font(.subheadline)
.foregroundColor(.secondary)
}
}
Spacer()
Text("\(item.valueInDollars)$").font(.title)
}
}
}
.onDelete(perform: delete)
.onMove(perform: move)
Text("No more items!")
}
.navigationBarTitle(Text("Homepwner"), displayMode: .inline)
.navigationBarItems(leading: EditButton(), trailing: Button(action: addItem) { Text("Add") })
}
}
//... functions
}
详细视图如下所示:
import SwiftUI
struct ItemDetailView: View {
@Binding var items: [Item]
let index: Int
var body: some View {
VStack {
VStack(alignment: .leading) {
HStack {
Text("Name: ")
TextField("Item Name", text: $items[index].name)
}
//... more TextFields
}
.padding(.all, 8.0)
VStack(alignment: .center) {
//... button
Image(systemName: "photo")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
}
}.navigationBarTitle(items[index].name)
}
}
类 Item 是 Identifiable 和 Equatable 并且只保存必要的成员,类 ItemStore 只保存一个 Items 数组。
解决方案
我刚刚尝试过这个(必须增强代码以便它完全可以编译)并且它可以工作:
import SwiftUI
struct Item : Equatable, Identifiable, Hashable {
var id = UUID()
var name: String
var serialNumber : String?
var valueInDollars : Int = 5
}
struct ContentView: View {
@State var items: [Item] = [Item(name: "hi"), Item(name: "ho")]
var body: some View {
NavigationView {
List {
ForEach(items, id: \.self) { item in
NavigationLink(destination: ItemDetailView(items: self.$items, index: self.items.firstIndex(of: item)!)) {
HStack {
VStack(alignment: .leading) {
Text(item.name).font(.title)
if item.serialNumber != nil {
Text(item.serialNumber!)
.font(.subheadline)
.foregroundColor(.secondary)
}
}
Spacer()
Text("\(item.valueInDollars)$").font(.title)
}
}
}
// .onDelete(perform: delete)
// .onMove(perform: move)
Text("No more items!")
}
.navigationBarTitle(Text("Homepwner"), displayMode: .inline)
// .navigationBarItems(leading: EditButton(), trailing: Button(action: addItem) { Text("Add") })
}
}
//... functions
}
struct ItemDetailView: View {
@Binding var items: [Item]
let index: Int
var body: some View {
VStack {
VStack(alignment: .leading) {
HStack {
Text("Name: ")
TextField("Item Name", text: $items[index].name)
}
//... more TextFields
}
.padding(.all, 8.0)
VStack(alignment: .center) {
//... button
Image(systemName: "photo")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
}
}.navigationBarTitle(items[index].name)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
推荐阅读
- ios - 限制 MKAnnotationView 仅在已绘制的折线上/与已绘制的折线一起拖动
- php - Laravel 资源控制器 show() 返回图片流
- asp.net-mvc - MVC 布局未清除,重定向内容加载在原始布局内
- javascript - 使用 XMLHttpRequest 的 Rapidapi Api 请求
- perl - Getopts 标记不带破折号的错误选项
- php - 将第二个表中的第二个(条件)结果添加到 SQL 查询
- annotations - PowerMockito:@PrepareForTest programaticcaly?
- bdd - 如何在 BDD / Gherkin 中描述预期的错误消息
- java - ERR:-ORA-06502:PL/SQL:数字或值错误:十六进制到原始转换错误
- python - 如何读取 csv 并将其写回与 pandas 克服浮点不精确的完全相同