首页 > 解决方案 > 显示数组的 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 数组。

标签: iosarraysswiftswiftuiswiftui-list

解决方案


我刚刚尝试过这个(必须增强代码以便它完全可以编译)并且它可以工作:

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()
    }
}

推荐阅读