UICollectionViewCell:在单元格中添加视图

时间:2014-08-14 09:19:44

标签: objective-c uicollectionview uicollectionviewcell

我有一个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.这会导致其他单元格随机顺序在滚动后消失。

2 个答案:

答案 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;
     }
  }