如何在 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”?