我有一个包含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;
}
答案 0 :(得分:0)
不使用可重用性? 在这个场景中,我不会使用可重用性
答案 1 :(得分: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];