【问题标题】:Create UICollectionViewCell subclass with xib [duplicate]使用 xib 创建 UICollectionViewCell 子类 [重复]
【发布时间】:2013-01-06 04:18:19
【问题描述】:

我正在尝试创建一个带有链接 xib 的 UICollectionViewCell 子类,我已经这样做了: 我创建了一个新的 xib 文件并在其中添加了一个 UICollectionViewCell,然后我创建了这个子类文件:

@interface MyCell : UICollectionViewCell

@property (weak, nonatomic) IBOutlet UILabel *label;
@end

我还在文件所有者自定义类中链接了界面生成器中的MyCell 类,并且我添加了一个UILabel,然后在我的UICollectionView viewDidLoad 中我这样做:

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

UINib *cellNib = [UINib nibWithNibName:@"MyCell" bundle:nil];
[self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"MyCell"];

还有这个:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *cell = (MyCell*)[cv dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];


cell.label.text = @"Cell Text";


return cell;
}

但是这不起作用,我收到此错误:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x907eca0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key label.'

我做错了什么?如何将 UICollectionViewCell 子类连接到 xib,并将其显示在 UICollectionView 中?

编辑:

我已经这样做了:

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

NSString *identifier = @"MyCell";

static BOOL nibMyCellloaded = NO;

if(!nibMyCellloaded)
{
    UINib *nib = [UINib nibWithNibName:@"MyCell" bundle: nil];
    [cv registerNib:nib forCellWithReuseIdentifier:identifier];
    nibMyCellloaded = YES;
}

MyCell *cell = (MyCell*)[cv dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];


cell.labelCell.text = @"Text";


return cell;
}

【问题讨论】:

  • 所以在使用带有连接类的 xib 的情况下,您似乎必须在 nib 文件和与 xib 链接的类上调用 collectionView 注册?您的工作流程是否调用了单元类的 initWithFrame 初始化程序?
  • 您的“编辑代码”有问题。成员函数内的静态变量由所有实例共享。如果你有多个视图控制器实例,只有第一个会调用registerNib

标签: ios iphone uicollectionview xib uicollectionviewcell


【解决方案1】:

确保 .xib 文件中的单元格知道单元格的类型。

选择界面生成器上的单元格

然后是身份检查员

随后将您的标签与您的属性相关联。 (我想你已经这样做了)

然后我建议验证您是否已经在 cellForItemAtIndexPath: 方法中加载了 .xib 文件

NSString *identifier = @"MyCell";    

    static BOOL nibMyCellloaded = NO;

    if(!nibMyCellloaded)
    {
        UINib *nib = [UINib nibWithNibName:@"MyCell" bundle: nil];
        [cv registerNib:nib forCellWithReuseIdentifier:identifier];
        nibMyCellloaded = YES;
    }

【讨论】:

  • 我已经编辑了我的问题...请看一下...
  • 不,对不起,我已经放大了单元格并且知道工作...
  • 您不能只在 viewDidLoad 上调用 registerNib 一次,而不是在每次集合视图请求单元格时进行检查吗?
  • 使用static 是一种不好的做法。静态变量为所有实例共享。同一类的第二个视图控制器不会加载 .xib 文件,因为 nibMyCellloaded 将被第一个设置为 YES
  • 这里的重要说明是.XIB文件的所有者不应该设置为MyCell,而只能设置为根元素类。否则解决方案不起作用。
【解决方案2】:

你可以在这篇文档UICollectionView adding UICollectionCell找到答案。

只有 StoryBoard 里面的 UICollectionView 里面有 UICollectionViewCell。如果使用 XIB,使用 CellName.xib 创建一个新的 XIB,将 CollectionViewCell 添加到其中,指定 UICollectionView 自定义类的名称。之后使用 registerNib. 示例代码:https://github.com/lequysang/TestCollectionViewWithXIB

【讨论】:

  • 谢谢。您的代码是唯一对我有用的代码。我只是想知道为什么要使用单元格weakUILabel 属性?我认为所有 IBOutlets 都必须是strong
  • @Ali 关于您的问题:stackoverflow.com/a/7729141/351810
猜你喜欢
  • 2021-09-23
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多