UICollectionView在IB中不包含UICollectionViewCell

时间:2012-10-08 23:31:36

标签: xcode interface-builder ios6 uicollectionview

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

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

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

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

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

4 个答案:

答案 0 :(得分:9)

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

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

这里有一个简短的总结:

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

@interface MyViewCell : UICollectionViewCell

  • 创建一个View(xib文件),其中Collection View Cell作为其根对象(并删除默认创建的对象)。
  • 在属性中将此Collection View Cell的自定义类设置为扩展类MyViewCell(而不是默认的UICollectionViewCell)。
  • Collection Liusable 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"];

答案 1 :(得分:8)

问题被问到已经有一段时间了,但我最近遇到了同样的问题。

最终,我找到了答案here

简而言之:

  • 如果您位于.xib文件中,则无法将UICollectionViewCell拖放到UICollectionView中。这只能在故事板中实现。
  • 解决方法是为自定义单元格创建.xib文件并使用以下方法手动注册单元格:

    android.database.sqlite.SQLiteException: near "(": syntax error (code 1): , while compiling: CREATE TABLE temp_dn_catalog_car ( catalog_car_id INTEGER PRIMARY KEY AUTOINCREMENT(11) NOT NULL, model_id INTEGER KEY(11) NOT NULL, generation_id INTEGER KEY(11) NOT NULL, body_type_id INTEGER KEY(11) NOT NULL, modification_id INTEGER KEY(11) NOT NULL, begin_year INTEGER(11) NOT NULL, end_year INTEGER(11) NOT NULL);

答案 2 :(得分:3)

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

然后,您必须在集合视图中注册nib:

- (void)viewDidLoad
{
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"];
}

答案 3 :(得分: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:。将自定义单元格存储在Interface Builder中的容器UICollectionView或UITableView中更加清晰。