首页 > 解决方案 > iOS 15 上 SwiftUI 中的意外列表行为

问题描述

我通过调用 ViewModel 文件并在 onAppear() 中传递当前用户来填充 SwiftUI 应用程序中的列表。此过滤器从数据库中提取的结果仅显示与用户相关的结果。在我在设备上安装 iOS 15 之前,以下所有内容都运行良好。该代码在 iOS 14、iOS 15 和 iOS 14 设备上的 iOS 模拟器中按预期工作。设备上的 iOS 15 出现此问题。打印的消息如下。

ForEach<Array, String, NavigationLink<OfferRowView, ModifiedContent<OfferDetailView, _EnvironmentKeyWritingModifier>>>:ID 在集合中出现多次,这将给出未定义的结果!

该视图不会加载列表中的项目。我已经打印出来测试它们是否重复,而它们不是。

查看文件

struct OfferHistoryView: View {
    let db = Firestore.firestore()

    @EnvironmentObject var authSession: AuthSession
    @EnvironmentObject var offerHistoryViewModel: OfferHistoryViewModel

    var body: some View {

        return VStack {
            List {
                ForEach(self.offerHistoryViewModel.offerRowViewModels, id: \.id) { offerRowViewModel in
                    NavigationLink(destination: OfferDetailView(offerDetailViewModel: OfferDetailViewModel(offer: offerRowViewModel.offer, listing: offerRowViewModel.listing ?? testListing1))
                                    .environmentObject(authSession)
                    ) {
                        OfferRowView(offerRowViewModel: offerRowViewModel)
                    }
                } // ForEach
            } // List
            .navigationBarTitle("Offer History")
        } // VStack
        .onAppear(perform: {
            self.offerHistoryViewModel.startCombine(currentUserUid: self.authSession.currentUserUid)
        })
    } // View
}

查看模型文件

class OfferHistoryViewModel: ObservableObject {
    var offerRepository: OfferRepository

    // Published Properties
    @Published var offerRowViewModels = [OfferRowViewModel]()
    
    // Combine Cancellable
    private var cancellables = Set<AnyCancellable>()
        
    // Intitalizer
    init(offerRepository: OfferRepository) {
        self.offerRepository = offerRepository
    }
    
    // Starting Combine - Filter results for offers created by the current user only.
    func startCombine(currentUserUid: String) {
        offerRepository
            .$offers
            .receive(on: RunLoop.main)
            .map { offers in
                offers
                    .filter { offer in
                        (currentUserUid != "" ? offer.userId == currentUserUid : false)
                    }
                    .map { offer in
                        OfferRowViewModel(offer: offer, listingRepository: ListingRepository())
                    }
            }
            .assign(to: \.offerRowViewModels, on: self)
            .store(in: &cancellables)
    }
}

任何帮助将不胜感激。

标签: swiftuiios15

解决方案


推荐阅读