UICollectionView页面滑动reloadData之后,Sections里的cell顺序变乱。

模仿原生的IOS的calendar写一个程序。
年份表示使用UICollectionView。

UICollectionView页面滑动reloadData之后,Sections里的cell顺序变乱。

开始的时候,顺序是正确的。

当向上或向下滚动的时候。月份的顺序就会变乱。

下面是代码

  • 数据源的代码

    // 定义展示的Section的个数
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return _years.count;
    }
    
    // 定义展示的UICollectionViewCell的个数
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return _years[section].months.count;
    }
    
    //每个UICollectionView的头部
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        
        if kind == "UICollectionElementKindSectionHeader"{
            let indexYear = _years[indexPath.section];
            let calendarAnnualHeaderView :CalendarAnnualHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "AnnualHeaderView", for: indexPath) as! CalendarAnnualHeaderView
            calendarAnnualHeaderView.yearlabel.text = String(indexYear.value)
            return calendarAnnualHeaderView
        } else {
            return UICollectionReusableView()
        }
    }
    
    //每个UICollectionView展示的内容
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let indexYear = _years[indexPath.section];
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AnnualCell", for: indexPath) as! CalendarAnnualCell
        
        cell._month = indexYear.months[indexPath.row]
        
        return cell
    }
  • 滑动的处理代码

    func scrollViewDidScroll(_ scrollView: UIScrollView){
        // 向下滑动
        if (scrollView.contentOffset.y + view.frame.size.height >= scrollView.contentSize.height ){ // Loads more videos
            let currentLastYear = _dataSource?._years.last
            let year = (currentLastYear?.value)! + 1
            _dataSource?._years.append(YearNode(value: year))
             _yearView.reloadData()
        }
        // 向上滑动
        if scrollView.contentOffset.y <= 0.0 {
            let currentLastYear = _dataSource?._years.first
            let year = (currentLastYear?.value)! - 1
            _dataSource?._years.insert(YearNode(value: year), at: 0)
            _yearView.reloadData()
             _yearView?.contentOffset.y = ( _yearView?.bounds.size.height)!
        }
    }

大家可以帮忙看一下是哪里的问题吗。

刚刚接触IOS。可能有些地方描述的不准确,见谅。

最后,谢谢。

scrollViewDidScroll是只要collectionView滑动就会调用, 当collectionView, 向上或者向下滑动时, scrollViewDidScroll会多次调用, 也就是说year一直在增或者减. 每次滑动year都在变化,显示的 month不是同一year的.

  • 制作可以通用的静态库遇到的问题
  • 高德地图自定义标注的气泡时,不能响应单击事件吗?
  • 求助如图所示动画怎么做
  • 新接手项目出现50000+ ~ 70000+ 的内存泄漏,求大神站出来破破破破破。。。
  • 在UITableView中如何计算Cell高度?
  • css3 html5 怎么做native 时间、城市选择器?
  • 提交app到AppStore,遇到问题了,大神们,帮忙看看!
  • App与后台同步数据问题
  • 支付宝支付集成,上传RSA公钥一直显示格式错误
  • 问一个关于IQKeyboardManager 使用问题
  • UIautomation 是否可以获取到 UIPasteboard里的内容?