页面控件不适用于 UITableView 中的 UICollectionView

page control not working for UICollectionView inside UITableView

我在为 table 视图中的集合视图设置页面控件时遇到问题。视图控制器中实际上有 2 个集合视图,一个在 tableView 外部,另一个在内部。我想要一个里面的页面控制。让我在下面分享代码,然后解释导致问题的原因:

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

     override func viewDidLoad() {
        super.viewDidLoad()

        //setup stories collection view
        let nib = UINib(nibName: "StoryCollectionViewCell", bundle: nil)
        cvStories.register(nib, forCellWithReuseIdentifier: "StoryCollectionViewCell")
        let layout1 = UICollectionViewFlowLayout()
        layout1.scrollDirection = .horizontal
        layout1.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
        collectionViewStories.setCollectionViewLayout(layout1, animated: true)
        collectionViewStories.delegate = self
        collectionViewStories.dataSource = self
        
        tblHome.dataSource = self
        tblHome.delegate = self
     }


    // MARK: - Table View
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tblHome.dequeueReusableCell(withIdentifier: "HomeTableViewCell", for: indexPath) as! HomeTableViewCell
        
        cell.collectionViewPostImages.dataSource = self
        cell.collectionViewPostImages.delegate = self
        cell.collectionViewPostImages.tag = indexPath.row
        cell.collectionViewPostImages.reloadData()
        
        cell.pageControl.hidesForSinglePage = true
        cell.pageControl.numberOfPages = self.posts[cell.collectionViewPostImages.tag].imagesArray?.count ?? 0
        
        return cell
        
    }

    //MARK: - Collection View
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        if collectionView == cvStories {
            return 2
        }
        else {
            return 1
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if collectionView == collectionViewStories {
            return stories.count
        }
        else {
            return posts[collectionView.tag].imagesArray?.count ?? 0
        }
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        if collectionView == collectionViewStories {
            
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StoryCollectionViewCell", for: indexPath) as! StoryCollectionViewCell
            //code to show stories
            return cell
            
        }
        else {
            
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeCollectionViewCell", for: indexPath) as! HomeCollectionViewCell
            //code to show images
            return cell
            
        }
        
    }

}

//TableViewCell Class
class HomeTableViewCell: UITableViewCell {
   
    @IBOutlet weak var collectionViewPostImages: UICollectionView!
    @IBOutlet weak var pageControl: UIPageControl!
    
    var currentPage = 0
    
    override func awakeFromNib() {
    
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.itemSize = CGSize(width: UIScreen.main.bounds.size.width, height: cvPostImages.frame.size.height)
        flowLayout.scrollDirection = .horizontal
        flowLayout.minimumInteritemSpacing = 0
        flowLayout.minimumLineSpacing = 0
        collectionViewPostImages?.collectionViewLayout = flowLayout

        collectionViewPostImages.showsHorizontalScrollIndicator = false
        
        collectionViewPostImages.isPagingEnabled = true
        
    }
    
    //ScrollView delegate method
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let pageWidth = scrollView.frame.width
        self.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
        self.pageControl.currentPage = self.currentPage
    }
    
}

整个代码就像 Instagram 应用程序,顶部的故事和带图片的帖子 tableView。整个代码在单个视图控制器中,一切正常。根据页数,即使点(页码)也是正确的,但是当您在它们之间滑动时,它们不会改变。我看到了许多解决方案,其中 pageControl.numberOfPages 在 cellForItemAt 函数中使用,但它超出了我的范围,所以我只是将其称为 cell。pageControl.numberOfPages 在 cellForRowAt 中。第一次在 tableView 中处理 collectionView,所以对它的工作感到困惑。

主要问题是您在 HomeViewController 中使用 cell.collectionViewPostImages.delegate = self,但在 HomeTableViewCell.

单元格中使用方法 scrollViewDidScroll

Collectionview 自己的滚动视图委托方法在 UICollectionViewDelegate 中触发。这就是为什么 scrollViewDidScroll 没有在您的单元格中触发。

解决方案是在删除集合视图的地方使用 scrollViewDidScroll。是HomeViewController

By the way, I dont recommend to use cell.collectionViewPostImages.dataSource = self cell.collectionViewPostImages.delegate = self in reusable cell. You dont want to make ...delegate = self on everytime when cell reused. You can take it in awakeFromNib in cell class