30

方法的作用是registerClass:forCellWithReuseIdentifier:什么?根据 Apple 的开发人员文档,它应该

“注册一个用于创建新集合视图单元格的类。”

当我尝试在我的项目中使用它时,我得到了一个黑色的集合视图。当我删除它时,一切正常。

#define cellId @"cellId"
#import "ViewController.h"
#import "Cell.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@property(strong, nonatomic)NSMutableArray * photoArray;


@end

@implementation ViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%@",_photoArray);
    _photoArray = [[NSMutableArray alloc]initWithCapacity:0];
    [_collectionView registerClass:[Cell class] forCellWithReuseIdentifier:cellId];
    for(int i=1;i<=12;i++)
    {
        NSString * imgName = [NSString stringWithFormat:@"%d.png",i];
        UIImage *img  = [UIImage imageNamed:imgName];
        [_photoArray addObject:img];
    }
}


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return _photoArray.count;
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

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

    Cell* cell = [_collectionView  dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
    cell.cellImage.image = [_photoArray objectAtIndex:indexPath.row];
    return cell;
}
4

2 回答 2

36

如果您已经在 Storyboard 中创建了 UICollectionView,连接了您的dataSourceand delegate,并且您已经添加了所有必需的方法:

  • numberOfItemsInSection
  • numberOfSectionsInCollectionView(不是必需的方法 -请参阅此评论
  • cellForItemAtIndexPath

然后registerClass/registerCell方法不是必需的。但是,如果您需要重用视图、数据或单元格,那么您应该使用这些方法,以便 iOS 可以根据需要填充您的 UICollectionView。这也可以在你的 Storyboard 中通过设置Prototype Cell来完成(与方法相同的原理registerClass

此外,如果您正在寻找关于它的registerCell作用和使用方法的良好解释,请查看此链接并滚动到标题为“单元格和视图重用”的底部部分。

于 2012-10-14T17:58:36.907 回答
4

同意RazorSharp 的回答,并想指出Techtopia 链接中对我来说的关键短语是:

If the cell class was written in code, the registration is performed using the registerClass: method of UICollectionView, otherwise use registerNib

于 2013-01-20T10:06:12.000 回答