2

我按照本教程创建了一个 UICollectionView。我复制了他们的代码没有问题,但是当我尝试它时,它崩溃了

- (void)viewDidLoad
{
    [super viewDidLoad];
    gridImages = [[NSMutableArray alloc]init];
    [gridImages addObject: @"test.jpg"];
    [gridImages addObject: @"test.jpg"];
    [gridImages addObject: @"test.jpg"];
    [gridImages addObject: @"test.jpg"];
    [gridImages addObject: @"test.jpg"];

}


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


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"Cell";

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    UIImageView *gridImageView = (UIImageView *)[cell viewWithTag:100];

    gridImageView.image = [UIImage imageNamed:[gridImages objectAtIndex:indexPath.row]];

    return cell;
}

崩溃在这一行:

 UIImageView *gridImageView = (UIImageView *)[cell viewWithTag:100];

如果我将 viewwithtag 更改为 99 或 101,它可以工作,但集合视图只是一个框,而不是 test.jpg 图像。viewwithtag 到底是什么?

碰撞:

[UICollectionViewCell setImage:]: unrecognized selector sent to instance 0x1659b300'

知道发生了什么吗?

编辑:对不起,标签 100 是与故事板中集合视图的 UIImageView 关联的标签。虽然仍然崩溃

4

2 回答 2

4

我不得不猜测您在 UICollectionViewCell 本身上设置了 100 标签,而不是在其中的 UIImageView 上。或者两个视图具有相同的标签集。viewWithTag 将返回它找到的带有该标签的第一个视图,因此您希望使它们独一无二。你有没有可能不小心先在整个单元格上设置了标签,然后又在图像视图上设置了它而忘记从单元格中删除它?任何 UIView 子类都可以有标签,因此在设置标签之前,您需要注意选择了哪个视图。

崩溃是因为 viewWithTag: 方法正在返回一个 UICollectionViewCell 实例,并且它没有实现您正在调用的 setImage: 方法(通过“gridImageView.image = ...”行)。

于 2013-10-12T05:33:33.283 回答
0

为了添加到接受的答案,该方法viewWithTag:首先搜索接收者,然后搜索其所有子视图以比较标签。因此,如果接收者指定了标签,它将被返回。从异常中可以清楚地看出,该setImage:方法是在 UICollectionViewCell 而不是 UIImageView 上调用的

于 2013-10-12T16:55:39.710 回答