我正在尝试将UICollectionView添加到IB中的.nib文件中。我已经完成了一些教程并没有遇到任何问题。
在我现有的应用程序中,当我将集合视图拖到IB中的视图中然后展开对象时,CollectionView Flow Layout就在那里,但是没有集合视图单元格。我也无法将单元格拖放到集合视图中。此外,集合视图的显示方式也不同,显示的是单元格网格的图像,而不是普通的白框。
我尝试使用nib创建一个新的视图控制器,并在添加collectionView时获得相同的结果。
此应用程序针对iOS 4.2,但我已将部署目标更改为iOS 6。
在任何新创建的项目中,我都没有这种行为。
答案 0 :(得分:9)
我无法告诉你为什么它不起作用,但对我来说,这篇博文中的子类方法解决了这个问题:
http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php
这里有一个简短的总结:
@interface MyViewCell : UICollectionViewCell
返回自定义类并修改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文件并使用以下方法手动注册单元格:
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中更加清晰。