我有一个uicollectionview,我试图在taplight时添加一个视图到collectionview单元格。
以下是我尝试实施的代码
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
WeekCell *cell = (WeekCell*)[collectionView cellForItemAtIndexPath:indexPath];
NSLog(@"%@", cell.descLabel.text);
UIView *view = [[UIView alloc]initWithFrame:cell.backgroundView.bounds];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 40, 40)];
label.text = @"new label";
[view addSubview:labels];
view.backgroundColor = [UIColor whiteColor];
[cell.backgroundView addSubview:view];
}
此处WeekCell
是包含属性视图UICollectionViewCell
的自定义backgroundview
。您还会在代码中注意到NSLog
。这将验证是否正在检索正确的单元格。根据代码,不起作用的是,文本应该用新的UILabel
更改为白色,但事实并非如此。细胞的外观不会改变。
修改
正如所建议的,我试图直接修改模型并调用reloadItemsAtIndexPaths
来重新加载数据。我遇到的问题是"窃听行为"被复制到未开发的单元格。
这是新代码:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
if([[modelArray objectAtIndex:indexPath.row] isEqualToString:@"1"]){
cell.overviewView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:imageString]];
}else{
cell.overviewView.alpha = 0;
}
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
WeekCell *cell = (WeekCell*)[collectionView cellForItemAtIndexPath:indexPath];
NSLog(@"%@", cell.descLabel.text);
if([[modelArray objectAtIndex:indexPath.row] isEqualToString:@"1"]){
[modelArray setObject:@"0" atIndexedSubscript:indexPath.row];
}else{
[modelArray setObject:@"1" atIndexedSubscript:indexPath.row];
}
NSLog(@"sequence : %@", modelArray);
[collectionView reloadItemsAtIndexPaths:@[indexPath]];
}
我正在做的是将tapped单元格中视图的alpha
值更改为0.这会导致其他单元格随机顺序在滚动后消失。
答案 0 :(得分:1)
UICollectionViewCell的backgroundView属性位于内容视图的后面。因此标签不可见的原因可能是因为它被内容视图掩盖了。 您可以为内容视图视图设置clearColor,或将新视图添加到contentView;
[cell.contentView addSubview:view];
希望这些信息有用。
答案 1 :(得分:1)
而不是:
[cell.backgroundView addSubview:view];
...添加到内容视图:
[cell.contentView addSubview:view];
<强>说明:强>
对集合视图单元格的直接操作可能会导致意外结果。例如,如果单元格被重用。最好更新由单元格呈现的模型并调用reloadItemsAtIndexPaths:
,它将自动(内部)调用collectionView:cellForItemAtIndexPath:
,它应该为可以调整其显示的单元格配置(或调用配置例程)。
<强>更新强>
您应该重置alpha
应该可见的单元格,下面是collectionView:cellForItemAtIndexPath:
方法并进行更正:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
if([[modelArray objectAtIndex:indexPath.row] isEqualToString:@"1"]){
cell.overviewView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:imageString]];
cell.overviewView.alpha = 1;
} else {
cell.overviewView.alpha = 0;
}
}