UITableview不从故事板更新uitableviewcell自定义单元格

时间:2014-11-20 18:36:13

标签: ios iphone uitableview uibutton

我尝试了解决此问题的解决方案。 我的最新代码是show blow:

  static NSString *simpleTableIdentifier = @"cell";

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

  [[cell viewWithTag:1000] removeFromSuperview];
      [[cell viewWithTag:2000] removeFromSuperview];

  // other code for setting view that works perfect then 
  if(some condition){
   UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
        [btn setImage:[UIImage imageNamed:@"upgrey.png"] forState:UIControlStateNormal];
        btn.frame=upButton.frame;
        [btn addTarget:self action:@selector(upButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:btn];
        UIButton *btn2=[UIButton buttonWithType:UIButtonTypeCustom];
        [btn2 setImage:[UIImage imageNamed:@"downgrey.png"] forState:UIControlStateNormal];
        btn2.frame=downButton.frame;
        [btn2 addTarget:self action:@selector(downButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:btn2];
        btn.tag=1000;
        btn2.tag=2000;
   }

  return cell;

但这不起作用。如果我加       [[cell viewWithTag:1000] removeFromSuperview];           [[cell viewWithTag:2000] removeFromSuperview];

开始时从所有单元格中删除按钮。如果我不使用这个。它显示了具有这两个按钮的所有单元格。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

即使您已经接受了自己的答案,我也会花一点时间来解释您遇到这个问题的原因以及如何在将来更好地构建UITableView

"它显示所有具有这两个按钮的细胞的原因"当您没有removeFromSubview行时,因为通过实施dequeueReusableCellWithIdentifier:,您可以重复使用您的单元格及其内容。在cellForRowAtIndexPath的每次调用中反复添加相同的子视图会使您重新使用单元格完全没有意义,因为您在其中绝对没有重复使用任何内容。因此,要么根本不重复使用您的单元格,要么更好,因为每个单元格的内容完全相同,重用您的单元格 重用这些按钮。

有两种很好的方法可以做到这一点。一种方法是创建一个UITableViewCell自定义子类。但既然你的细胞'内容相当简单,你说你的else条件已经有用了,我建议采用一种不同的方式,可能会少一些代码密集型。这是我的建议:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Create two identifiers -- one for "some condition" one 
    // for the "other condition"
    static NSString *simpleTableIdentifier1 = @"cell1";
    static NSString *simpleTableIdentifier2 = @"cell2";

    if (some condition) {

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier1];

        // Only add the buttons when cell == nil, i.e. during the first
        // time cell's initialized to hold a UITableViewCell
        if (cell == nil) {

            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier1]

            UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
            [btn setImage:[UIImage imageNamed:@"upgrey.png"] forState:UIControlStateNormal];
            btn.frame=upButton.frame;
            [btn addTarget:self action:@selector(upButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
            [cell addSubview:btn];
            UIButton *btn2=[UIButton buttonWithType:UIButtonTypeCustom];
            [btn2 setImage:[UIImage imageNamed:@"downgrey.png"] forState:UIControlStateNormal];
            btn2.frame=downButton.frame;
            [btn2 addTarget:self action:@selector(downButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
            [cell addSubview:btn2];
        }

    } else {

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier2];

        if (cell == nil) {

            ....