22

我正在尝试将 UICollectionView 添加到 IB 中的 .nib 文件中。我已经完成了一些教程并且没有任何问题。

在我现有的应用程序中,当我将集合视图拖到 IB 中的视图中然后展开对象时,CollectionView Flow Layout 在那里,但没有集合视图单元格。我也无法将单元格拖放到集合视图中。此外,集合视图的显示方式也不同,显示的是单元格网格的图像,而不是正常的白框。

我尝试使用 nib 创建一个新的视图控制器,并且在添加 collectionView 时得到相同的结果。

此应用程序面向 iOS 4.2,但我已将部署目标更改为 iOS 6。

在任何新创建的项目中,我都没有这种行为。

4

4 回答 4

9

我无法告诉你为什么它不起作用,但对我来说,这篇博文中的子类方法解决了这个问题:

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

这是一个简短的总结:

  • 创建一个扩展 UICollectionViewCell 的新类 MyViewCell 并根据需要创建属性、操作、出口和方法。

@interface MyViewCell : UICollectionViewCell

  • 创建一个以 Collection View Cell 作为其根对象的视图(xib 文件)(并删除默认创建的对象)。
  • 在属性中,将此 Collection View Cell 的自定义类设置为您的扩展类 MyViewCell(而不是默认的 UICollectionViewCell)。
  • 在 Collection Reusable View 下的属性中定义一个标识符,例如 myCell,稍后您将需要它来注册您的调用。
  • 返回您的自定义类并修改 inithWithFrame 方法以加载和使用您创建的视图。

    - (id)initWithFrame:(CGRect)frame 
    { 
       self = [super initWithFrame:frame]; 
       if (self) 
       { 
         // Initialization code 
         NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil];
    
         if ([arrayOfViews count] < 1) { return nil; }
    
         if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; }
    
         self = [arrayOfViews objectAtIndex:0];
       }
       return self;
    }
    
  • 然后你可以注册这个类供collectionView使用

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

于 2012-12-19T17:47:02.187 回答
9

自从提出这个问题以来已经有一段时间了,但我最近遇到了同样的问题。

最终,我在这里找到了答案。

简而言之:

  • 如果您在 .xib 文件中,则不能将 UICollectionViewCell 拖放到 UICollectionView 中。这只能在故事板中实现。

  • 解决方法是为您的自定义单元创建一个 .xib 文件并使用以下方法手动注册该单元:

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

于 2015-10-16T13:14:47.683 回答
3

在单独的 nib 文件中定义单元格视图。视图必须是类型UICollectionViewCell或子类。

然后,您必须将 nib 注册到您的集合视图中:

- (void)viewDidLoad
{
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"];
}
于 2012-11-17T11:03:36.737 回答
0

虽然这些答案是正确的,但问题的根本原因非常微妙,Apple 需要在日志中更新他们的错误消息。当你看到:

Unknown class MyViewCell in Interface Builder file.

它实际上意味着您的源代码缺少@implementation声明或.m 文件尚未添加到目标中。所以检查你的代码并确保你有:

@implementation MyViewCell

@end

UITableViewCell 和 UICollectionViewCell 都是如此。

对于一般情况,我在https://stackoverflow.com/a/12755891/539149进一步讨论了这个问题。

有趣的是,如果您缺少@implementation并调用:

[self.myCollectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"MyViewCell"];

你会看见:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_MyViewCell", referenced from:
      objc-class-ref in MyViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以Apple知道这个问题,他们只是在编译期间没有检测到它。我建议不要将自定义单元格放在单独的 nib 中或调用 registerClass: forCellWithReuseIdentifier:。将自定义单元格存储在其容器 UICollectionView 或 Interface Builder 中的 UITableView 内要干净得多。

于 2014-04-01T21:33:55.670 回答