21

正如标题所示,我有UICollectionView一个UIViewController通过 IB 连接的。我有一个UICollectionView名为imageCell. 在 viewcontrollerviewDidLoad方法中,我像这样注册类:

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;

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

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

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

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

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

注意:我在制作课程时没有为课程创建 XIB,imageCell我使用的是 Storyboard。

4

8 回答 8

87

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

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

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

你在用故事板吗?然后..

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

于 2013-04-18T04:23:55.097 回答
45

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

于 2013-04-18T04:32:46.027 回答
20

我用下面的行替换常规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)

于 2016-01-11T14:04:38.920 回答
1

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

于 2016-08-17T21:44:17.010 回答
1

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

使用此注册方法:

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

而不是这个:

myCollectionView.register(myCustomCell.self, forCellWithReuseIdentifier: "myCustomCell")
于 2020-12-07T06:58:08.390 回答
0

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

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

于 2013-04-19T06:32:20.287 回答
0

我使用 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.
}
于 2015-07-28T12:48:36.360 回答
0

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

于 2016-12-16T23:10:10.533 回答