场景 - 我必须以编程方式创建一个自定义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
当有人遇到此类问题时的其他情况 -
- 当我们将单元格大小设置为比集合视图大时。
- 当我们的单元格布局大小太大或集合视图未正确保存时。
答案 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()