uitableview问题中的两个Textfield

时间:2012-07-31 05:00:34

标签: iphone ios5 uitableview uitextfield

我有一个带有 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;

3 个答案:

答案 0 :(得分: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];
}

现在,在块之后,您可以假设每个单元格只有一个标签和一个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
}

答案 1 :(得分: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];
}

答案 2 :(得分:0)

返回之前

添加[cell setNeedsDisplay];线。

[cell setNeedsDisplay];
返回单元格;

没关系。

感谢名单。