在自定义UICollectionView类中实现时,数据源方法未正确调用

时间:2016-08-11 13:56:27

标签: ios swift uicollectionview

场景 - 我必须以编程方式创建一个自定义UICollectionView类,必须在我想要的任何地方展示。

代码到现在 -

对于自定义UICollectionView

 class ABSegmentView: UICollectionView,UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {

        var segmentProperties=segmentControlProperties()//segmentControlProperties is a modal class having relevant details regarding about population of collection view.
        override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
            super.init(frame: frame, collectionViewLayout: layout)
            self.dataSource = self
            self.delegate = self
            self.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellIdentifier")

        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

        func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int{
            return 1
        }

        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            print(segmentProperties.titleArray)
            return segmentProperties.titleArray.count//data properly being received over here
        }

//not getting called
        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

            let cell = self.dequeueReusableCellWithReuseIdentifier("cellIdentifier", forIndexPath: indexPath)
            cell.backgroundColor = UIColor.redColor()
            return cell
        }


        func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
            return CGSizeMake(self.segmentProperties.segmentHeight, self.segmentProperties.segmentWidth)
        }




    }

在某个地方添加此集合视图的代码 -

let segment = ABSegmentView(frame: CGRectMake(0, 0, 200, 200), collectionViewLayout: UICollectionViewLayout())
        segment.segmentProperties.segmentWidth = 60
        segment.segmentProperties.segmentHeight = 50
        segment.segmentProperties.titleArray = ["heyy","heyy","heyy","heyy","heyy","heyy"]
        self.view.addSubview(segment)

所以添加的内容只是一个空的集合视图。

原因想通了

在调试时,我发现我的数据源方法cellForItemAtIndexPath()& func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath)没有被调用。

问题 - 我不确定我为所需方案做的是正确的实施与否。如果我遗漏某些地方或可能是我的错误,请修改我。

编辑: 回答 - 感谢Santosh的回答。我发现我误解了collectionViewLayout的概念。

调查结果 -

  • 我必须为集合视图设置一个合适的流布局 适当的流量布局,正确的间距和其他值是相当的 对于正确铺设的集合视图至关重要。

    CollectionView Flow布局是集合视图的UI,即网格视图。

    StackOverflow中存在许多问题,这些问题涉及由于不正确地放置collectionViewFlowLayout而未调用的数据源方法。

引用除了接受的答案外,对我有用 -

https://stackoverflow.com/a/14681999/5395919

当有人遇到此类问题时的其他情况 -

- 当我们将单元格大小设置为比集合视图大时。

- 当我们的单元格布局大小太大或集合视图未正确保存时。

2 个答案:

答案 0 :(得分:1)

您正在使用UICollectionViewLayout使用collectionView实例化自定义layout。尝试使用UICollectionViewFlowLayout。下面的代码可以帮助您,让我知道它是否有效:

let layout = UICollectionViewFlowLayout()
layout.minimumInteritemSpacing = 20//you can change this value
layout.scrollDirection = .Vertical//or may be .Horizontal

let segment = ABSegmentView(frame: CGRectMake(0, 0, 200, 200), collectionViewLayout: layout)
segment.segmentProperties.segmentWidth = 60
segment.segmentProperties.segmentHeight = 50
segment.segmentProperties.titleArray = ["heyy","heyy","heyy","heyy","heyy","heyy"]
self.view.addSubview(segment)
segment.reloadData()

答案 1 :(得分:0)

为了更新数据源,您需要调用reloadData()