0

我有一个2 行 n 4 个部分的 uitableview,每个单元格中 都有一个标签和文本字段。问题是我的标签出现在所有部分中,因为我的文本字段在其他部分中没有重复。实际上,每个单元格都有两个文本字段,一个是普通文本字段,另一个是选择器文本字段(当我单击 TF 时,选择器会弹出)。对于一个部分,TF 都来了,但在其他部分没有重复

我的代码

static NSString *CellIdentifier = @"Cell";

UITextField *textField;

NSString *string=[NSString stringWithFormat:@"ident_%d",indexPath.row];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:string];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
       }
cell.selectionStyle=UITableViewCellSelectionStyleNone;

UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(50, 10, 100, 35)];
[lbl1 setFont:[UIFont systemFontOfSize:16]];
[lbl1 setTextColor:[UIColor blackColor]];
[lbl1 setBackgroundColor:[UIColor clearColor]];

if (indexPath.row==0) {

    lbl1.text = @"Quantity";
    [cell.contentView addSubview:self.qntTF];

}

if (indexPath.row==1) {
    lbl1.text = @"Unit";
    [cell.contentView addSubview:self.unitTF];
  }

// Configure the cell...;
textField  =[self.tableArray objectAtIndex:indexPath.row];
[cell.contentView addSubview:textField];
cell.textLabel.text = nil;
textField.tag = TextFieldTag;
cell.detailTextLabel.text = nil;
[cell addSubview:lbl1];
[lbl1 release];

return cell;
4

3 回答 3

1

代码现在的方式是,您添加的标签比您想象的要多得多(每次表格滚动时),您只添加一个文本字段,然后将其移动到不同的单元格。它最终出现在最后渲染的任何单元格上。

现在,您的 cellForRow... 方法的方式是,每次出现任何部分的第 0 行和第 1 行时——包括当用户只是在屏幕上滚动它们时——另一个文本视图和标签作为子视图添加到单元格中。向上和向下滚动 100 次,单元格中将有 100 个文本视图和标签堆叠在一起。

为避免这种情况,请仅在创建单元格时添加子视图。所以在这个街区...

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    UILabel *label = /* all of your label init */
    label.tag = kSOME_UNIQUE_INT_CONST;

    UITextField *textField = /* all of your text field init */
    textField.tag = kSOME_OTHER_UNIQUE_INT_CONST

    [cell addSubview:label];
    [cell addSubview:textField];
}

现在,在块之后,您可以假设每个单元格都只有一个标签和一个文本字段。下一项工作是找到它们(它们要么是刚刚创建的,要么已经在单元格中,如果它被重复使用)......

UILabel *label = (UILabel *)[cell viewWithTag:kSOME_UNIQUE_INT_CONST];
UILabel *textField = (UITextField *)[cell viewWithTag:kSOME_OTHER_UNIQUE_INT_CONST];

现在您已准备好为给定的部分和行配置单元格。这里的关键是要记住你经常得到重复使用的单元格。它们仍将针对已滚动的行进行配置。所以每个“if”块都需要一个相应的“else”块来改变子视图的状态:

if (indexPath.row == 0) {
    label.text = @"Quantity";
    // not sure what view you were adding here, but don't
    // subview adds only in the cell==nil block above
} else {
    label.text = /* whatever the label should be for row != 0 */
    // this is important:  if you change label state in the if, you
    // must specify it's state also in an else, otherwise you'll see
    // leftover state on the label when the cell is reused for a different row
}
于 2012-07-31T05:33:41.833 回答
0

在返回单元格之前添加 [cell setNeedsDisplay]; 线。

[单元集NeedsDisplay];
返回单元格;

会没事的。

谢谢。

于 2012-07-31T05:48:39.027 回答
0

为什么不以与标签相同的方式初始化文本框?

你有TextField:

UITextField *textField;

然后标签:

UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(50, 10, 100, 35)];
[lbl1 setFont:[UIFont systemFontOfSize:16]];
[lbl1 setTextColor:[UIColor blackColor]];
[lbl1 setBackgroundColor:[UIColor clearColor]];

你为什么不在标签附近试试这个:

UITextField *textfield = [[UITextField alloc]initWithFrame:CGRectMake(LOCATION)];
[textfield setTextColor:[UIColor blackColor]];
[textfield setBackgroundColor:[UIColor clearColor]];
[textfield setBorderStyle:UITextBorderStyleNone];

也可能是您从中获取文本字段的数组中只有两个文本字段?

也可能是因为看起来您没有实例化一个新的文本框,只是一遍又一遍地从实现中添加相同的文本框,例如:

if (indexPath.row==0) {

    lbl1.text = @"Quantity";
    [cell.contentView addSubview:self.qntTF];

}

if (indexPath.row==1) {
    lbl1.text = @"Unit";
    [cell.contentView addSubview:self.unitTF];
}
于 2012-07-31T05:09:02.700 回答