自定义UITableViewCell,一个包含两个子视图和滚动的UIView

时间:2015-02-05 05:57:13

标签: ios uitableview

我有一个自定义UITableViewCell,它有一个名为updateCell的方法。它添加了一个spotView,它只是一个UIView,self.spotView有几个子视图。

问题是当我滚动时,spotView会很好地启动,但是当你滚动时,它会填满这些子视图和不准确的信息。我该如何解决这个问题?

我在自定义的UITableViewCell中尝试过prepareForReuse,并尝试删除了Spotview的子视图,但这并不起作用。

我有点困惑但是我需要让它正常工作。我看到我可以将uilabel设置为nil以备重复使用,这似乎有效,但这些UIViews似乎很常见:

-(void)updateCell:(MenuItem *)item
{
    self.spotView =[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 10.0f, 10.0f)];
    [self.contentView addSubview:self.spotView];


    [self renderHeader:menuItem.header];
    [self renderDetail:menuItem.detail];
    [self renderMeta:menuItem];
    ...
}

- (void)renderMeta:(MenuItem *)menuItem{
  if([self.spotView.subviews count]>0){
    NSLog(@"THERE ARE subviews in spotView in renderMeta for %@", menuItem.header);
  }else{
    NSLog(@"NO subviews in spotView in renderMeta for %@", menuItem.header);
  }


  for (UIView* view in [self.spotView subviews])
  {
    NSLog(@"!!!about to remove subviews here!!!");
        [view removeFromSuperview]; // <- not working
  }


  if([menuItem hasInstoreImage] || [menuItem hasTastingNotes]){
    if([menuItem hasInstoreImage]){
      UIView *instoreImageDot=[self circleWithColor:[UIColor redColor] radius:4];
      NSLog(@"adding instoreImageDot in renderMeta");
      [self.spotView addSubview:instoreImageDot];
    }else{
      NSLog(@"no instoreImageDot in renderMeta");
    }

编辑#1

玩弄这个,我发现尝试操纵自定义UITableViewCell中的视图是一个很大的不可预测的问题。我在代码中执行所有自定义UITableViewCell,因为我将在内部向公司分发Cocoapod。 DID的工作原理是在ViewController中操作单元格,如:

// Does not work on iOS below 6.0
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
   if([cell isKindOfClass:[MenuItemCell class]]){
     NSLog(@"A MenuItem Class");
     MenuItemCell *miCell=(MenuItemCell *)cell;
     [miCell.spotView removeFromSuperview];
   }
}

编辑#2

调用updateCell的位置/方式(稍微缩写为某些代码被取出):

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  [self.menuTV registerClass:[MenuItemCell class]forCellReuseIdentifier:@"MenuItemCell"]; 

  static NSString *MenuItemCellIdentifier=@"MenuItemCell";

  id dic=self.menu.listItems[indexPath.row];

  if([dic isKindOfClass:[EMBERSMenuItem class]]){
    //MenuItemCell *cell = [self.menuTV dequeueReusableCellWithIdentifier:MenuItemCellIdentifier];
    MenuItemCell *cell = [self.menuTV dequeueReusableCellWithIdentifier:MenuItemCellIdentifier  forIndexPath:indexPath];

    //MenuItem *menuItem=(MenuItem *)dic;
    MenuItem *menuItem=(MenuItem *)dic;

    cell.menuItem=menuItem; // <- probably shouldn't have this
    [cell updateCell:menuItem];

  }else{

1 个答案:

答案 0 :(得分:1)

您应该在单元格的init方法中添加您的单元格中的子视图。否则,如果每次渲染单元格时添加子视图,则单元格将在渲染发生时结束具有尽可能多的子视图。

举个例子:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        [self.contentView addSubview:mySubview];
    }
}

然后您可以使用配置方法来注入您的单元格数据:

- (void)configureCellWithData:(id)data {
    self.mySubview.setText(data.text);
}