如何在 UICollectionViewCell 中设置 UILabel

Posted

技术标签:

【中文标题】如何在 UICollectionViewCell 中设置 UILabel【英文标题】:How to set a UILabel in UICollectionViewCell 【发布时间】:2013-07-30 21:32:24 【问题描述】:

我有一个带有 UIViewController 的应用程序,其中有一个 UICollectionView IBOutlet。

UICollectionView 中的单元格是 MyCustomCell 并且有这个方法设置它的 UILabel:

-(void)setCellLabel:(NSString *)value
    NSLog(@"settinglabel");
    cellLabel.text = @"hardcode"; //added for testing purposes

单元格具有将其标识为情节提要中的 MyCustomCell 的属性 Class type 及其出队标识符。 UIViewController 采用数据源和委托协议。 IBOutlet UILabel 的 cellLabel 出口连接到情节提要。方法定义为:

- (void)viewDidLoad
    [super viewDidLoad];
    self.restNames = @[@"Orange",@"Naranja",@"Narnia"];

    [self.collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier:@"MyCustomCellID"];


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
    NSLog(@"%d",[self.restNames count]);
    return [self.restNames count];


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

    MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];


    [cell setCellLabel:@"hi"];
    NSLog(@"fitsname %@",[self.restNames objectAtIndex:indexPath.row]);


    return cell;

我在我的 tableview 中绘制了三个单元格,对应于我的数组中的 3 个对象。该数组仅包含我由 objectAtIndexPath 直接设置的字符串对象,但我决定将其直接设置为 @"hi",因为它不起作用。我什至将 setCellLabel 方法中使用的值更改为硬编码值,并且在每个单元格中只获取“标签”默认字符串。

为什么 cellLabel 设置不正确?

【问题讨论】:

【参考方案1】:

您是否在界面生成器中设置了 cellLabel 插座?

您的单元格的 .h 文件中应该有类似的内容:

@property (weak, nonatomic) IBOutlet UILabel *cellLabel;

然后你真的只需要这样做:

cell.cellLabel.text = @"";

【讨论】:

是的...它连接到 UICollectionViewCell 标签 你又在调用 [self.collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier: CellIdentifier] 吗?如果您使用的是故事板,则不想调用它。它将覆盖您在故事板中的内容。 我删除了这一行,因为我使用的是故事板,但我只得到了默认的“标签”文本。有了这条线,我得到了空白单元格,我猜这是预期的。问题是标签没有从默认 LABEL 设置为我的值。 那么您需要深入挖掘。调用 setCellLabel 时是否 cellLabel == nil?此外,您可能应该使用 self.cellLabel Patrick,谢谢,我将 IBOutlet UILabel 作为 ivar,所以我将其设置为属性。现在我使用 self.cellLabel.text = @"string" 而不仅仅是 cellLabel.text = ... 但是,我在 cellForItemAtIndexPath 中添加了对 cell.cellLabel == nil 的 if 测试,它确实记录为 nil。【参考方案2】:

当你使用 Storyboard 时,默认模板是错误的,因为它使用了行

[self.collectionView registerClass:[UICollectionView class] forCellWithReuseIdentifier:CellIdentifier];

但是故事板已经注册了它。所以基本上这就是创建基于UICollectionView 的自定义故事板所必须做的:

    创建您的 UICollectionViewController 子类 单击并拖动UICollectionViewController 到情节提要并根据需要更改配置 创建一个UICollectionViewCell 子类 在情节提要中设置单元格类,设置它的重用标识符 ctrl-拖动所需的插座 删除[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier: CellIdentifier];UICollectionView子类中设置静态复用标识符

【讨论】:

【参考方案3】:

您可能忘记告诉您的UICollectionView 它应该使用什么类来创建单元格。这是通过以下代码行完成的:

[self.collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier: CellIdentifier];

您可以在控制器的 viewDidLoad 末尾设置它。

【讨论】:

如果您使用 Interface Builder,则不需要运行此命令。 我正在使用故事板...我在 viewDidLoad 中得到了这一行 你检查 setCellLabel 是否被调用了吗? 还要检查你的插座是否设置正确(UICollectionView 和 UICollectionViewCell) 我更新了问题。插座已连接并正在调用 setCellLabel,我刚刚插入了一个 NSLog,它记录正​​常。

以上是关于如何在 UICollectionViewCell 中设置 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中刷新 UICollectionViewCell?

如何在 UICollectionViewCell 内缩放 UIScrollView?

如何在重新加载时清除 UICollectionViewCell?

Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?

点击时如何在 UICollectionViewCell 中制作此动画?

如何确定何时显示 UICollectionViewCell?