UICollectionView - 未显示单元格

19
我想要实现一个带有UICollectionView的3x3表格,但是当运行应用程序时它并没有显示任何单元格。尽管我将CollectionView的背景色设置为蓝色,它确实显示了这个背景色。请问有人能够帮助我吗?
我所做的是创建一个storyboard,并在其中简单地拖动了一个CollectionViewController。这个控制器还带有一个嵌套的CollectionView。然后我使用设置将其背景设置为蓝色,并添加了一个单元格,我将其背景设置为紫色(仅用于测试)。最后我将UILabel拖到了它上面。现在当我运行它时,它只显示蓝色的背景,但没有单元格,尽管在编辑器中它们清楚可见。我尝试创建一个自定义的UICollectionViewController,将类分配给CollectionViewController而不是标准类,并对单元格执行相同操作(分配自定义UICollectionViewCell)。在自定义的UICollectionViewController中,我实现了以下方法:
-(NSIntegear)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 9;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    AboutYourGoalsMultiSelectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    [[cell goal]setText:@"T"];

    return cell;
}

我将单元格的标识符设置为“Cell”,并在CollectionView和自定义UICollectionViewController之间建立了dataSource和delegate的输出连接。一切都编译正常。 那么我错过了什么吗?使用编辑器难道不应该在进行所有这些调整之前显示出某些东西吗?

图中是我所做的所有更改的故事板编辑器截图


CollectionViewCell 的单元格标识符设置为“Cell”了吗? - mharper
是的,集合可重用视图 > 标识符设置为 "Cell",身份 > 恢复 ID 也是这样。 - Ke Vin
没有什么特别引人注目的地方。我会在 collectionView:cellForItemAtIndexPath: 中设置一个断点,以便 a) 确保它被调用了,b) 查看可能出现的其他问题。 - mharper
5个回答

49

点击此处查看我的答案。简而言之,如果您在使用故事板,请删除此行代码

 // Register cell classes
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];

这就是它对我不起作用的主要原因。在使用故事板时,XCode默认插入了这个。很好的发现。 - qiksand
只需添加 [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; 就可以按照苹果文档的说明以编程方式注册单元格。使用 registerClass:forCellWithReuseIdentifier:registerNib:forCellWithReuseIdentifier: 方法之一将单元格与重用标识符相关联。您可以在父视图控制器的初始化过程中调用这些方法作为其中的一部分。 - Fauad Anwar

6

一个常见的错误是在Outlets中没有设置dataSource和delegate。


2
正如我现在所学到的,另一个非常令人沮丧的错误来源是AutoLayout:确保UICollectionView不会被压缩为零大小。 - BlenderBender
好提示!您可以将 UICollectionView 的大小设置为 CGRect.zero,但是当将其设置为大于 CGRect.zero 的值时,请调用集合视图上的 reloadData() 方法以显示单元格。 - Manuel
如果您遇到了有关未识别选择器的崩溃,请确保您的视图控制器具有正确的自定义类! - George

3

你的代码第一行出现了错误。

-(NSIntegear)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

NSIntegear 应该改为 NSInteger

不确定这是否是问题,因为 Xcode 不应允许您在出现此错误时运行项目。我刚刚尝试了您提到的完全相同的步骤(没有标签),但进行了上述更正并且对我而言工作良好。这是一个屏幕截图:

enter image description here


2

由于我没有找到直接的解决方案,所以我尝试设置了一个新项目,并进行了相同的更改和调整,令人惊讶的是,这一次从一开始就一切都运行正常。然后我将故事板复制到我的旧项目中,删除了所有旧文件,并用新项目的文件替换了它们。目前为止一切都运行良好。我不知道实际错误是什么,但我很高兴现在它能够正常工作。感谢所有查看我的问题的人!


0
如果您正在尝试创建一个简单的CollectionViewController(非自定义,即通过实现),并且当应用程序运行时您的单元格未显示,请按照以下步骤操作:
首先,您必须为UICollectionViewController创建可可触摸类(如果未创建)。文件->新建->cocoa touch class,然后从子类的下拉列表中选择UICollectionViewController。
现在,在您的CollectionViewController的identity inspector部分下,通过从自定义类的下拉列表中选择它来添加您的类。
现在打开您创建的类并编辑以下方法:
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { //#warning Incomplete method implementation -- Return the number of sections return 1 } override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { //#warning Incomplete method implementation -- Return the number of items in the section return 1 }
仅编辑“返回”值(默认情况下为0),只需简单地编写要显示或已创建的单元格/项的数量(在这种情况下,我只创建了一个单元格)。

[ios] [swift3] [xcode]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接