0

我有一个 20 行的简单 tableView。我创建了一个子类自定义 UITableview 单元格,并在 cellforRowAtIndex 中,每隔 3 行向单元格添加一个文本字段。当我向上和向下滚动时,文本字段显示在错误的行中。注意,我不能让 UItextfield 成为我的自定义单元格的一部分,因为这可以是任何东西,复选框,单选按钮,但为简单起见,我选择了 UITextfield ...我做错了什么?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:   (NSIndexPath *)indexPath
  {
    static NSString *CellIdentifier = @"TestCellIdentifier";
    testCell *cell = (testCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if(!cell)
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
else{

    //HMMM I also tried removing it before adding it- it doesn't work neither
    for(UIView *v in cell.subviews){
        if(v.tag == 999 ){
            [v removeFromSuperview];
        }
    }

   //add UItextField to row if it's divisible by 3 
    if(indexPath.row %3 ==0){

        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(400, 10, 300, 30)];
        textField.borderStyle = UITextBorderStyleRoundedRect;
        textField.font = [UIFont systemFontOfSize:15];
        textField.placeholder = [NSString stringWithFormat:@"%d",indexPath.row];
        textField.autocorrectionType = UITextAutocorrectionTypeNo;
        textField.keyboardType = UIKeyboardTypeDefault;
        textField.returnKeyType = UIReturnKeyDone;
        textField.clearButtonMode = UITextFieldViewModeWhileEditing;
        textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        textField.tag = 999;

        [cell addSubview:textField];
    }
}


cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];


return cell;
}
4

2 回答 2

0

不使用可重用性?在这个场景中,我不会使用可重用性

于 2013-11-15T03:40:05.627 回答
0

重复使用细胞是一件好事,你应该能够做到。

您可以考虑在单元格离开屏幕时从单元格中删除文本字段,然后再排队重用,在委托协议方法中:

– tableView:didEndDisplayingCell:forRowAtIndexPath:

知道行号,您将知道是否删除文本字段。


编辑添加说明:

乍一看你的代码看起来不错,所以我做了一个小测试项目。原始代码的问题在于您将文本字段添加到错误的“视图”中——UITableViewCells 有一些您需要注意的结构。查看 UITableViewCell contentView 属性的文档。它部分说:

如果您想通过简单地添加额外的视图来自定义单元格,您应该将它们添加到内容视图中,以便在单元格进入和退出编辑模式时适当地定位它们。

所以代码应该添加并枚举单元格内容视图的子视图:

    for(UIView *v in cell.contentView.subviews){
        if(v.tag == 999 ){
            [v removeFromSuperview];
        }
    }
...
   textField.tag = 999;
   [cell.contentView addSubview:textField];
于 2013-11-15T16:01:33.850 回答