初始化UICollectionViewCell时,viewWithTag返回nil

时间:2014-01-28 07:49:10

标签: ios objective-c uicollectionview uicollectionviewcell

刚开始使用UICollectionView。我使用IB在UICollectionView中创建了一个简单的UIViewController。它通过分页水平滚动。我在UICollectionViewCell内放置了一个简单的UICollectionView。我为单元格设置了重用标识符。

我在UILabel内放置了一个标记为100的UICollectionViewCell

viewDidLoad中,我致电:

[_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Thing"];

稍后我尝试像这样初始化单元格:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Thing" forIndexPath:indexPath];
    cell.backgroundColor = [UIColor greenColor];

    UILabel *nameLabel = (UILabel *)[cell viewWithTag:100];
    nameLabel.text = @"Bogus";

    return cell;
}

当我运行应用程序时,视图正确加载;我可以水平滚动通过2个单元格。我看到每个细胞都有丑陋的绿色。

但是,viewWithTag方法返回nil,因此未设置nameLabel文本。

为什么?

请注意,我还尝试定义UICollectionViewCell的自定义子类并使用它调用registerClass。在IB中,我将单元格类更改为自定义子类,并将UILabel绑定到子类中的UILabel出口。

但这也行不通。 (我宁愿避免使用自定义子类方法,因为似乎没有必要定义只是为了保存IBOutlets。)

我想我在这里遗漏了一些明显的东西。

此处描述的类似问题:

Trouble accessing Image from instance of UICollectionViewCell

2 个答案:

答案 0 :(得分:26)

删除registerClass行。你是在故事板上做的,所以你不需要它。

答案 1 :(得分:1)

试试吧

UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:100];

更新

您可以查看单元格的层次结构及其所有子视图标记:[self showAllSubView:cell] ;,您是否可以找到带有标记10的标签?

- (void)showAllSubView:(UIView *)view
{
    for (UIView * subView in [view subviews]) {
        NSLog(@"%@, tag:%d", subView, subView.tag) ;
        [self showAllSubView:subView] ;
    }
}