apptekstudios / ASCollectionView

A SwiftUI collection view with support for custom layouts, preloading, and more.
MIT License
1.35k stars 160 forks source link

ASTableView warning (view does not load) #241

Open trevordevs opened 2 years ago

trevordevs commented 2 years ago

Describe the bug On first load the tableview works as expected, when switching to another view and going back the view is empty and this is the warning I get: "[TableView] Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window)."

To Reproduce

@EnvironmentObject var hvm: HomeViewModel
ZStack(alignment: .top) {
                if self.hvm.moments.isEmpty && !self.isPreparingView {
                    VStack(alignment: .center, spacing: self.viewPadding) {
                        Text("Nothing to see here!")
                            .font(Font.pjsBold(size: 17))
                        Text("Check back later to see your Story Moments.")
                            .font(Font.pjsMedium(size: 16))
                    }
                    .foregroundColor(Color.theme.textLight)
                    .frame(width: geoSize.width, height: geoSize.height)
                } else if !self.isPreparingView {
                    ASTableView(section: ASTableViewSection(id: 0, data: self.hvm.moments, contentBuilder: { moment, cell in
                        MediaView(showSaveAnimation: self.$showSaveAnimation, currentUserData: self.$currentUserData, moments: self.$hvm.moments, moment: moment, geo: geo, viewPadding: self.viewPadding)
                    }))
                    .onScrollDidEnd({ scrollView, velocity in
                        if velocity.y > 1.5 && self.hvm.momentIndex != (self.hvm.moments.count - 1) {
                            self.hvm.momentIndex += 1
                            self.scrollPosition = .pageDown(CGPoint(x: 0, y: CGFloat(self.hvm.momentIndex) * geoSize.height))
                        } else if velocity.y < -1.5 && self.hvm.momentIndex != 0 {
                            self.hvm.momentIndex -= 1
                            self.scrollPosition = .pageUp(CGPoint(x: 0, y: CGFloat(self.hvm.momentIndex) * geoSize.height))
                        } else {
                            self.scrollPosition = .pageZero(CGPoint(x: 0, y: CGFloat(self.hvm.momentIndex) * geoSize.height))
                        }
                    })
                    .scrollPositionSetter(self.$scrollPosition)
                    .scrollIndicatorEnabled(false)
                    .separatorsEnabled(false)

                    CustomNotifView(showNotifAnimation: self.$showSaveAnimation, imageSystemName: "checkmark", text: "Saved to your moments", notifTimeShown: 1.0, geoSize: geoSize)
                        .frame(width: geoSize.width, height: geoSize.height, alignment: .center)
                }
            }
            .ignoresSafeArea(.all, edges: .top)
            .onAppear {
                print(self.hvm.moments)
                guard self.hvm.moments.isEmpty else {
                    self.scrollPosition = .pageZero(CGPoint(x: 0, y: CGFloat(self.hvm.momentIndex) * geoSize.height))
                    return
                }
                if let userLiveStory = self.userLiveStory {
                    self.hvm.getNewLiveMedias(userData: self.currentUserData, userLiveStory: userLiveStory) {
                        self.isPreparingView = false
                        self.scrollPosition = .top
                    }
                } else {
                    self.udm.getLiveUserStory(userID: self.currentUserData.id) { userLiveStory in
                        guard let userLiveStory = userLiveStory else { return }
                        self.userLiveStory = userLiveStory
                        self.hvm.getNewLiveMedias(userData: self.currentUserData, userLiveStory: userLiveStory) {
                            self.isPreparingView = false
                            self.scrollPosition = .top
                        }
                    }
                }
            }

Expected behaviour I expect the view to show the original view after switching back since the data is store in an environmentobject. (cacheCells() does not work)

Xcode Version:

Simulator, Device, Both?