以 UIViewController 作为数据源的 UICollectionView
Posted
技术标签:
【中文标题】以 UIViewController 作为数据源的 UICollectionView【英文标题】:UICollectionView with UIViewController As Data Source 【发布时间】:2013-03-20 06:03:25 【问题描述】:我有一个字典数组,其中第一个键作为图像。我使用 UIViewController 作为数据源。
@interface myViewController ()
NSMutableArray *textureArray1;
NSMutableDictionary *dict1;
UIImage *key1a; // UIImage
NSString *key1b; // texture name
使用 UIViewController 中布置的 TableView 控件填充这个字典数组没有问题。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
UIImage *image = [[textureArray1 objectAtIndex:indexPath.row] objectForKey:key1a];
cell.textLabel.text = [[textureArray1 objectAtIndex:indexPath.row] objectForKey:key1b];
cell.imageView.image = image;
return cell;
我想做一些新的事情。我想用 UICollectionView 填充相同的图像数组,其中 UIViewController 是数据源。不幸的是,我在网上找到的许多教程都将 UICollectionViewController 作为数据源。无论如何,我有以下几行代码。
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithPatternImage:[[textureArray1 objectAtIndex:indexPath.row] objectForKey:key1b]];
return cell;
并且应用程序崩溃并显示“无法识别的选择器发送到实例......”的错误,我不知道如何使用 UICollectionView。那么如何将 UICollectionView 与 UIViewController 一起使用呢?
感谢您的帮助。
附:以下是错误信息。
2013-03-20 10:21:07.777 iPadapp[2023:c07] -[__NSCFString _tiledPatternColor]: unrecognized selector sent to instance 0xdeacdf0
2013-03-20 10:21:07.778 iPadapp[2023:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString _tiledPatternColor]: unrecognized selector sent to instance 0xdeacdf0'
【问题讨论】:
发布实际的错误信息。 当然。我已经编辑了原始问题。 我认为错误是由于您从 [[textureArray1 objectAtIndex:indexPath.row] objectForKey:key1b]] 返回的内容。你应该记录你从那个表达式中得到的类。它似乎是一个字符串,而不是图像。 糟糕...这是我自己犯的愚蠢错误。有一个错字。 cell.backgroundColor = [UIColor colorWithPatternImage:[[textureArray1 objectAtIndex:indexPath.row] objectForKey:key1a]];对不起,伙计们。感谢您的宝贵时间。 是的,rdelmar。谢谢。 【参考方案1】:您需要说明您的 UIViewController
是标题中的 UICollectionViewDataSource
和 UICollectionViewDelegate
。 See this answer
【讨论】:
好的。感谢您的建议。【参考方案2】:这是一个简单的例子。你的 viewController 应该符合 UICollectionViewDelegate
和 UICollectionViewDelegateFlowLayout
- (void)viewDidLoad
[super viewDidLoad];
// Create the collection view and add it as a sub view
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(120, 120);
layout.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20);
layout.minimumInteritemSpacing =10.0f;
layout.minimumLineSpacing = 10.0f;
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
self.collectionView.backgroundColor = [UIColor whiteColor];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
[self.view addSubview:self.collectionView];
// Implement the required data source methods
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
return 50;
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellId =@"cell";
CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
cell.backgroundColor = [UIColor redColor];
return cell;
【讨论】:
以上是关于以 UIViewController 作为数据源的 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章
UINavigation 控制器 UIViewController 和 UItoolbar 作为子视图问题
在 UIViewController 中嵌入 UIContainerView 作为屏幕的一部分
如何将 UIViewController 作为子视图添加到 UIViewController(RootViewController)?