【问题标题】:Unrecognized selector on custom subclass自定义子类上无法识别的选择器
【发布时间】:2015-04-08 04:34:15
【问题描述】:

我花了一些时间查看其他类似的帖子,但无法找到我的确切问题。我是 iOS 和目标 c 的新手,所以它可能非常简单。

我正在继承 UICollectionViewCell:

@interface FooCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UILabel *cellLabel;
@end

在我的 UIViewController 自定义子类中,我正在尝试为 cellLabel 设置一个值:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        FooCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    // Configure the cell
    UILabel *label = [[UILabel alloc] init];
    label.text = @"whatever";
    cell.cellLabel = label;

    return cell;
}

我的应用在运行时崩溃:

[UICollectionViewCell setCellLabel:]: 无法识别的选择器发送到实例 0x7fef224144f0

如果我理解该错误,它看起来是在抱怨我试图在 UICollectionViewCell 的实例上设置 cellLabel 属性,而不是子类 FooCollectionViewCell 的实例。

但是,当我在该行添加断点并查看我的变量时,我看到:

单元格 FooCollectionViewCell * 0x7fcb5340dcd0 0x00007fcb5340dcd0

从我的代码中也可以看出,该对象必须是 FooCollectionViewCell 类型,因为 cell 被实例化为类型。

我设置故事板的过程是:

  1. 将 CollectionViewController 拖到我的故事板中
  2. 将其自定义类设置为 FooCollectionViewController。这似乎有效,因为我的代码被调用了。
  3. 在自动创建的集合视图中单击自动创建的原型单元格,将其自定义类设置为 FooCollectionViewCell。将 Identifier 设置为“FooCell”,并将 ViewController 中的 reuseIdentifier 变量更新为“FooCell”。

我有什么遗漏吗?

【问题讨论】:

  • 在您的故事板/NIB 中,您是否将“表格视图单元”的自定义类设置为 FooCollectionViewCell 以用于具有您的重用标识符的那个?
  • 您是使用故事板还是使用自定义 .xib 如果您正在使用 .xib,那么您必须在 viewdidload 方法中注册您的 nib。我认为该单元正在制作但它没有分配价值尝试清理构建您的文件夹并重置您的模拟器然后它将解决您的问题
  • 在您的代码中看不到哪个类用于创建单元格实例。引用 var cell 的类型没有任何意义。你在 xib/SB 中设置了什么?请在代码中添加对单元格类的检查,以查看是否有其他类实例化了单元格对象。
  • @Tom,是的,重用标识符匹配并且自定义类在我的故事板中正确设置。尽管如果重用标识符不匹配,我根本不希望调用此代码,对吗?如果自定义类与 FooCollectionViewCell 不匹配,我预计 dequeReusableCellWithReuseIdentifier 调用会因类型错误而失败?
  • 不,这不会导致它失败。您只是告诉编译器您希望该单元格是 FooCollectionViewCell,并且编译器假定您知道自己在做什么。你需要回答汤姆的问题;这很可能是问题所在。

标签: ios objective-c uicollectionviewcell unrecognized-selector


【解决方案1】:

你说你遵循教程。那么你完成了这些步骤了吗?

实现了基本的集合视图类并与情节提要对象相关联,现在是时候设计单元格了。这很简单,就是将项目从对象库拖放到情节提要视图中的原型单元上。此外,可以通过选择单元格并使用生成的调整大小手柄来修改单元格的大小。单元格的确切设计完全取决于要显示的内容。然而,就本示例而言,每个单元格只是显示一个图像。

因为您正在代码中创建一个新标签,而它应该已经在原型单元格中可用。您只需分配 cell.cellLabel.text = @"bla bla";

UILabel *label = [[UILabel alloc] init];
label.text = @"whatever";
cell.cellLabel = label;

【讨论】:

  • 即使这样也行不通。问题是我在用我的重用标识符注册 UICollectionViewCell 超类的代码中有一个冲突的语句。你提到的第二个问题是我需要做才能真正看到文本变化
【解决方案2】:

我发现了问题所在。当我创建视图控制器子类时,该文件自动具有

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];

在我的 viewDidLoad 方法中。所以我认为这压倒了我在故事板中所做的事情。 FML,但我学到了一些东西。感谢您的帮助!

解决方法是删除此行,因为我在情节提要中对其进行了配置。

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多