我在我的应用程序中使用collectionView。我在didSelect委托中为单元backgroundView设置图像。但是当我选择一个单元格indexPath时,图像将被设置为3个单元格的indexPath。当我滚动collectionView时,图像会随机变化?请帮我。提前谢谢。
- (void)viewDidLoad
{
[super viewDidLoad];
[collection registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:uio];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection: (NSInteger)section
{
return 50;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"index %@",indexPath);
UICollectionViewCell *cell = [collection cellForItemAtIndexPath:indexPath];
cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];
}
答案 0 :(得分:2)
那是因为你重复使用你的细胞。一个选项是使用一个字典变量来表示你的单元格已被选中,如果还没有,则重置图像。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"index %@",indexPath);
UICollectionViewCell *cell = [collection cellForItemAtIndexPath:indexPath];
cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];
[selectedDictionary setObject:[NSNumber numberWithBool:YES] forKey:[NSNumber numberWithInteger:indexPath.row]];
}
然后在您的cellForItemAtIndexPath方法中,您将检查该值
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
forIndexPath:indexPath];
BOOL selected = [[selectedDictionary objectForKey:[NSNumber numberWithInteger:indexPath.row]] boolValue];
if(selected){
cell.backgroundView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"download.jpg"]];
}else{
cell.backgroundView = nil;
}
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
当然如果你使用某种对象作为模型,那么在这里选择一个变量是合适的,你不再需要nsdictionary了。
答案 1 :(得分:2)
问题是dequeueReusableCellWithReuseIdentifier
。
滚动UICollectionview
时会重复使用单元格,这是有问题的
在Collectionview
内添加scrollview
。
试试这个内部:
Scroll_View是您的滚动视图
集合是您的Collectionview
-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
self.Scroll_View.contentSize = CGSizeMake(self.view.frame.size.width, collectionView.contentSize.height);
CGRect fram_For_Collection_View = self.collection_view.frame;
fram_For_Collection_View.size.height = collectionView.contentSize.height;
self.collection.view.frame = fram_For_Collection_View;
}
答案 2 :(得分:0)
您的-collectionView:didSelectItemAtPath:
正在向该单元格添加新的图片视图。重复使用单元格时,没有任何东西可以删除该图像视图。所以,当你说:
UICollectionViewCell *cell = [collection dequeueReusableCellWithReuseIdentifier:uio
forIndexPath:indexPath];
在您的-collectionView:cellForItemAtIndexPath:
中,您可能会找回已有一个或多个图片视图的单元格。
我的建议是将图像视图添加到单元格原型中的单元格中,可能在故事板或单元格的初始化程序中。让-collectionView:cellForItemAtIndexPath:
将该图像视图的图像设置为给定路径的正确图像。
答案 3 :(得分:0)
发生的事情是UICollectionView重用了单元格。所以在didSelectItemAtIndexPath中:你设置了单元格背景,但是UICollectionView会根据需要重用相同的单元格(并且你没有重置cellForItemAtIndexPath中的cell.backgroundView :)。
解决此问题的方法是维护所选单元格的NSIndexSet。在didSelectItemAtIndexPath中:您可以添加所选项的索引,然后通过调用reloadItemsAtIndexPaths强制重新加载该项。然后,在你的cellForItemAtIndexPath中:检查索引集以查看是否包含所选索引,如果是,则设置单元格的backgroundView。
答案 4 :(得分:0)
前几天我有同样的问题&我在这里发了一个问题。这是我得到的答案&它对我有用。
Collection View Cell multiple item select Error
如果您使用的是自定义单元格,则可以将此代码添加到该单元格的init
方法中。它也会起作用。
CGFloat borderWidth = 6.0f;
UIView *bgView = [[UIView alloc] initWithFrame:frame];
bgView.layer.borderColor = [UIColor redColor].CGColor;
bgView.layer.borderWidth = borderWidth;
self.selectedBackgroundView = bgView;