这可能是一个重复的帖子,但我还没有找到解决方案:
我将UICollectionView
设置为:
UINib *nib = [UINib nibWithNibName:@"CollectionViewCell"
bundle:[NSBundle mainBundle]];
[_collectionView registerNib: nib forCellWithReuseIdentifier:@"bCell"];
(我试图设置委托,没有委托,等等)。
但是,只有
时会调用 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
没有。
我已经检查了 numberOfItemsInSection 我返回了,它总是> 0(它恰好是17)。
我已经检查过调用[_collectionView reloadData];
,但也没有任何事情发生。
我尝试了不同的东西,但我无法使其发挥作用。
此外,我的UICollectionView
应该在这里,但不是:
有没有人有线索? 谢谢。
答案 0 :(得分:38)
好的,我认为这可能对今后的问题有用......
这是因为StoryBoard的限制。我真的不明白为什么会发生这种情况,因为我只是固定了一个水平空间。我删除了水平空间作为该视图的约束,一切正常。
好吧,让我们的生命流动。
答案 1 :(得分:16)
我也面临同样的问题,最后知道我为collectionViewLayout传递了错误的类对象,我改为 UICollectionViewFlowLayout 而不是 UICollectionViewLayout ,同时为UICollectionView创建对象低于它的凝视所有代表方法。
collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout())
答案 2 :(得分:15)
将此添加到viewDidLoad:
self.automaticallyAdjustsScrollViewInsets = NO;
答案 3 :(得分:13)
<强> 1。当您在numberOfItemsInSection方法上返回超过0个项目时,将调用cellForItemAtIndexPath。
<强> 2。检查您的UICollectionViewFlowLayout是正确的还是您自己的。 UICollectionViewLayout是抽象类,不能直接使用
第3。检查集合视图单元格的大小&amp;收集视图。
<强> 4。尝试在代码中设置您的集合视图大小。 [yourCollectionViewFlowLayout setItemSize:CGSizeMake(200,200)];
5.如果它们中的任何一个不起作用,那么杀死XCode&amp;重新开始 。有时它会解决问题。
Apple说
UICollectionViewLayout类是一个抽象基类,您可以将其子类化并用于生成集合视图的布局信息。布局对象的工作是确定集合视图边界内的单元格,补充视图和装饰视图的位置,并在询问时将该信息报告给集合视图。然后,集合视图将提供的布局信息应用于相应的视图,以便可以在屏幕上显示它们。
您必须继承UICollectionViewLayout才能使用它。但是,在考虑子类化之前,您应该查看UICollectionViewFlowLayout类,看看它是否可以适应您的布局需求。
答案 4 :(得分:12)
我也遇到了这个问题。我检查了所有可能的问题,一切看起来都不错。然后我试着改变了重载方法。
[self.colView reloadData]
- &gt; [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:x]];
然后一切顺利。但是我还是不明白怎么做。
答案 5 :(得分:7)
我刚刚发现,只要至少有一个单元格的高度为零,就会调用none of cellForItemAtIndexPath(在iOS 10中)。
免责声明:对不起,如果这应该是评论 - 声誉不够。
答案 6 :(得分:3)
对于我来说,在我将collectionView的约束设置为0,然后再次将其设置为“实际大小”之后,第一次没有调用 cellForItemAtIndexPath 。
@IBOutlet weak var collectionVwHeightContraint: NSLayoutConstraint!
if attachments.count > 0 {
collectionVwHeightContraint.constant = 100
}else {
collectionVwHeightContraint.constant = 0
}
// collectionVwHeightContraint is my collectionView height Contraint outlet
我通过以下方式解决了这个问题:
self.view.layoutIfNeeded()
希望它将对某人有所帮助:)
答案 7 :(得分:1)
帮助我的是设置正确的itemSize
。由于身高错误,我的cellForItemAtIndexPath
没有被调用。
所以我将大小设置为:
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(170, 300)];
答案 8 :(得分:1)
对我来说问题是我以编程方式创建了Collection View,但我已经将CGRectZero
作为其框架。我在viewDidLoad
之后使用自动布局进行布局。如果在加载视图控制器时布置集合视图,它最终会正确调用cellForItemAtIndexPath:
。
答案 9 :(得分:1)
可能会帮助别人,这可能是两件事:
要解决此问题,我实现了UICollectionViewLayout的方法: 扩展TableViewCellActionItemPageControl:UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 414, height: 213)
}
答案 10 :(得分:0)
要完成@frank答案:(迅速回答)
extension UICollectionView {
func reloadFirstSection() {
let indexPath = IndexPath(item: 0, section: 0)
reloadSections(IndexSet(integer: indexPath.section) )
}
}
然后调用collectionView.reloadData()
而不是collectionView.reloadFirstSection()
答案 11 :(得分:0)
就我而言,它正在交替运行。 然后在主线程上运行 reloadData()并修复了问题。 但是后来经过某些更改后,又出现了同样的问题。最后,我像下面这样。现在没问题了,我觉得 self.view.layoutIfNeeded()起着关键作用
DispatchQueue.main.async {
self.view.layoutIfNeeded()
self.collectionView.reloadData()
}
答案 12 :(得分:0)
在我的情况下,collectionViewCell的高度大于CollectionView的高度。
答案 13 :(得分:0)
reza_khalafi 的答案对我有用,我使用的是Xcode 11和Swift 4.2。 迅速的reza答案的4.2版本。
将此添加到viewDidLoad
self.automaticallyAdjustsScrollViewInsets = false
答案 14 :(得分:0)
就我而言,我搞砸了自定义单元格标签约束。再次验证您的约束条件。
答案 15 :(得分:0)
我遇到过类似的问题。问题在于sectionOfItems部分。 如果节中的节数或行数低于零,则可能不会调用您的cellForRowAtIndexPath。
答案 16 :(得分:0)
对我而言,我的collectionView容器没有translatesAutoresizingMaskIntoConstraints = false
答案 17 :(得分:0)
我在故事板上的收藏视图插座遇到了同样的问题&#34;标准&#34;约束(底部,顶部,前导,尾随固定到内部视图)。
我这样解决了:
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = self.collectionView.frame.size