UICollectionViewCells 没有出现在 UICollectionView 中

Posted

技术标签:

【中文标题】UICollectionViewCells 没有出现在 UICollectionView 中【英文标题】:UICollectionViewCells not appearing in a UICollectionView 【发布时间】:2013-04-18 01:12:47 【问题描述】:

正如标题所示,我有一个 UICollectionView,它通过 IB 连接到 UIViewController。我有一个名为imageCellUICollectionView 子类。在 viewcontroller viewDidLoad 方法中,我这样注册类:

CGRect collectionViewRect = CGRectMake(384, 60, 728, 924);
UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
imageCollectionView = [[UICollectionView alloc] initWithFrame:collectionViewRect collectionViewLayout:flow];
[imageCollectionView registerClass:[imageCell class] forCellWithReuseIdentifier:@"Cell"];
imageCollectionView.delegate = self;
imageCollectionView.dataSource = self;

然后我在 viewDidAppear 中调用一个名为 getPhotos 的方法(出于 UI 原因),该方法从服务中获取照片,然后我在 getPhotos 中调用 [imagCcollectionView reloadData];

然后在cellForItemAtIndexPath 我执行以下操作:

imageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
GRKAlbum *album = [albums objectAtIndex:indexPath.item];
cell.titleLabel.text = album.name;
return cell;

我知道我在这里没有做错任何事情,因为正在调用该方法并且cell 不是nilalbum 也不是。

所以,当我运行所有这些代码时,UICollectionView 出现了,但里面什么都没有。我只能看到collectionView 的背景颜色。任何帮助都将不胜感激。

注意:当我创建 imageCell 类时,我并没有为它创建 XIB,而是使用 Storyboards。

【问题讨论】:

【参考方案1】:

有一些方法可以调试这种情况。

    注册 UICollectionViewCell 类而不是您的 customCell 并在 cellForItem... 中设置单元格的背景颜色

    如果单元格出现在第一步中,请尝试使用您自己的单元格类并设置其背景

你在使用故事板吗?那么..

您不必为集合视图注册任何单元格。您可以使用原型单元,只需为单元提供正确的 id。您可以设计原型单元中的所有内容。并非所有情况都需要自定义类。

【讨论】:

非常感谢.. 这是非常有用的解决方案。我刚刚删除了 [self.collectionView registerClass:[cutomCollectionCell class] forCellWithReuseIdentifier:@"cutomCollectionCell"];哇,它工作正常。 这个问题困扰了我半天。不敢相信解决起来这么简单。我希望下一个版本的 XCode 至少会显示一些警告,如果他们认为 registerClass 对故事板来说是不必要的或不当行为。 删除 registerClass 部分对我也有帮助。非常感谢! 中国有句古话:授人以鱼不如授人以渔:) @ScriptKitty 是的,我的陈述有点令人困惑。并非在所有情况下都需要自定义类,例如如果您在情节提要中作为原型单元进行操作并且您没有太多要自定义的内容。拥有一个自定义类以更好地访问单元格属性非常好,否则您可以通过viewWithTag 访问【参考方案2】:

如果您在情节提要中创建了单元格,则只需删除 register 类语句。如果您在情节提要中制作单元格,则不需要注册任何内容(对于集合视图或表格视图)(实际上,如果这样做,它会搞砸)。您唯一需要做的就是确保您在 IB 中设置了标识符。

【讨论】:

RegisterClass: 搞砸了我。 :( :) 这为我解决了问题。任何知识渊博的人都知道为什么它不仅不能这样工作,而且完全搞砸了? 你永远是我的英雄,@rdelmar!我其实对此一无所知。我碰巧留下了具有“注册”功能的现在默认示例代码——我只使用过在故事板中自然生成的单元格——所以我不知道发生了什么。感谢您的保存!【参考方案3】:

用下面的行替换传统的registercell 行解决了同样的问题

[self.collection registerNib:[UINib nibWithNibName:@"nibname" bundle:nil] forCellWithReuseIdentifier:identifier];

Swift 4.2 版本:(感谢 Nikolay Suvandzhiev)

self.collection.register(UINib(nibName: "nibname", bundle: nil), forCellWithReuseIdentifier: identifier)

【讨论】:

这对我有帮助!如果您的单元有 XIB,请使用此方法。我正在使用自动完成,然后使用 registerClass:forCellWithReuseId: 登陆,这导致我的视​​图无法加载,因此无法显示。 谢谢,这成功了! Swift 4.2 版本:self.collection.register(UINib(nibName: "nibname", bundle: nil), forCellWithReuseIdentifier: identifier)【参考方案4】:

当我意识到我的收藏视图单元格被我的导航栏覆盖时,我感觉自己像个傻瓜。所以,请确保您的导航栏(如果有的话)没有覆盖您正在测试的集合视图单元格。

【讨论】:

【参考方案5】:

错误在于您注册 Nib/Xib 文件的方式(使用 Swift 5):

使用这个注册方法:

myCollectionView.register(UINib(nibName: "myCustomCell", bundle: nil), forCellWithReuseIdentifier: "myCustomCell")

而不是这个:

myCollectionView.register(myCustomCell.self, forCellWithReuseIdentifier: "myCustomCell")

【讨论】:

【参考方案6】:

您正在代码中实例化一个新的集合视图,但没有将视图添加到屏幕上。您说您已经在使用情节提要,我猜您可以看到情节提要中的集合视图,它可能没有连接到数据源或委托?要么,要么你没有在正确的集合视图上调用 reload。

要么在情节提要中配置您的集合视图(并为必须在代码中完成的任何事情设置一个出口),要么完全在代码中设置它。目前我认为你有两个集合视图。

【讨论】:

【参考方案7】:

我是使用 Xcode 6.2 故事板制作的。希望对你有帮助

#import <UIKit/UIKit.h>

@interface InfoSecurity : UIViewController
@property (strong, nonatomic) IBOutlet UICollectionView *tabsCV;

@end

.m
**************

#import "InfoSecurity.h"
#import "TabsCell.h"

@interface InfoSecurity ()<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>

@end

@implementation InfoSecurity

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [self.tabsCV registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"TabsCell"];



- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    return 03;

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

    return 01;

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    return CGSizeMake(90, 50);

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    NSString *reuseIdentifier = @"tabscellID";


    TabsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    cell.TabTitleLabel.text= @"OPTIONS";

    return cell;


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.

【讨论】:

【参考方案8】:

有时集合视图单元格是黑色的(与背景颜色相同,不可见,隐藏不是),重新加载可见单元格是一种解决方法。

【讨论】:

以上是关于UICollectionViewCells 没有出现在 UICollectionView 中的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UICollectionViewCells 具有圆角和阴影?

尝试使用自定义布局使屏幕外 UICollectionViewCells 预渲染

将 UIKit Dynamics 添加到 UICollectionViewCells 的正确方法是啥?

在横向上消失的 UICollectionViewCells

用 UICollectionView 和 UICollectionViewCells 创建刷卡栈?

为啥屏幕外的 UICollectionViewCells 不会更新?