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

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

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

  • iOS 百度地图SDK 与导航SDK 文件重复 duplicate symbols 怎么解决 急急急!
  • itmsservices ios7.1 问题
  • iOS 在UIController拿到cell类里面的数据
  • iOS 用UICollectionView 做瀑布流,做好之后cell过早的被重用(看不见了),怎么解决?
  • iOS开发,自定义百度地图的大头针和点击事件
  • 如何在自己iOS项目内打开苹果手机自带的Wallet应用。
  • 开始的时候,顺序是正确的。

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

    下面是代码

    • 数据源的代码

        // 定义展示的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。可能有些地方描述的不准确,见谅。

    最后,谢谢。

  • swift中哪种property声明方式更好?为什么
  • iOS使用xib自定义cell控件为空求大神支招
  • iOS app外面角标和app里面未读角标数量统一问题。
  • 可以提供一份公司里的iOS编码规范吗 ?
  • ViewDidLoad和ViewDidAppear两个方法中的self.view.frame不同?
  • UIWebView打不开某些网站
  • One Solution collect form web for “UICollectionView页面滑动reloadData之后,Sections里的cell顺序变乱。”

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

    .