在UITableViewCell中复制UITextField

时间:2015-03-10 16:54:24

标签: ios objective-c uitableview

我的UITable个单元格包含UILabelUITextField。当我更新一个单元格中的文本时,它还会更新表格中另一个单元格中的文本。

我找到了许多答案,指出dequeueReusableCellWithIdentifier重用单元格的方式。但是,我似乎无法弄清楚如何解决这个问题。无论我尝试什么,都没有任何区别或导致细胞是空的。

这是我的代码

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

NSString *cellID = [NSString stringWithFormat:@"%@ %ld", @"DataCell_", (long)indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CheckListCell"];

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

id obj = [stories objectAtIndex:indexPath.row];

question = (UILabel *)[cell viewWithTag:101];
question.text = [obj valueForKey:@"Question"];

response = (UITextField *)[cell viewWithTag:102];  //THIS IS GETTING DUPLICATED
response.placeholder = [obj valueForKey:@"Question"];

checklistSwitch = (UISwitch *) [cell viewWithTag:103];
cellCheck = cell;

//ResponseTypes C=Checkbox, R=Radiobox, TF=Textfield, TA=Textarea, N=Number, M=Misc
if ([[obj valueForKey:@"ResponseType"] isEqualToString:@"C"] || [[obj valueForKey:@"ResponseType"] isEqualToString:@"R"]) {

    question.hidden = FALSE;
    response.hidden = TRUE;
    if ([[obj valueForKey:@"Checked"] boolValue])
        cellCheck.accessoryType = UITableViewCellAccessoryCheckmark;
    else
        cellCheck.accessoryType = UITableViewCellAccessoryNone;

} else if ([[obj valueForKey:@"ResponseType"] isEqualToString:@"N"]) {

    checklistSwitch.hidden = TRUE;
    question.hidden = TRUE;
    response.hidden = FALSE;
    cellCheck.accessoryType = UITableViewCellAccessoryNone;

} else {

    checklistSwitch.hidden = TRUE;
    question.hidden = TRUE;
    response.hidden = FALSE;
    cellCheck.accessoryType = UITableViewCellAccessoryNone;
    [response setKeyboardType:UIKeyboardTypeDefault];

}

return cell;

}

3 个答案:

答案 0 :(得分:1)

我建议你继承UITableViewCell的子类并重构你的代码:

- (void)viewDidLoad {
    [_tableView registerClass:[YourTableViewCellSubClass class] forCellReuseIdentifier:NSStringFromClass([YourTableViewCellSubClass class])];
}

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

    YourTableViewCellSubClass *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([YourTableViewCellSubClass class]) forIndexPath:indexPath];
    if (XYZ){
        [self configureXYZCell:cell atIndexPath:indexPath];
    }
    if (ABC){
        [self configureABCCell:cell atIndexPath:indexPath];
    } else {
        [self configureSomeCell:cell atIndexPath:indexPath];
    }
}

- (void)configureXYZCell:(YourTableViewCellSubClass *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.label.text = self.datasource[indexPath.row];
    cell.textfield.text = ... 
    cell.switch.on = ...    
}

- (void)configureABCCell:(YourTableViewCellSubClass *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.label = 
    cell.textfield = 
    cell.switch =   
}

- (void)configureSomeCell:(YourTableViewCellSubClass *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.label = 
    cell.textfield = 
    cell.switch =   
}

答案 1 :(得分:0)

这种情况正在发生,因为正在重用单元格,因为UITextfield的先前值仍保留在重用单元格中。使用回调

tableView:didEndDisplayingCell:forRowAtIndexPath:

就像细胞走出可见区域一样。 尝试将文本字段文本中的文本设置为nil或@""。应该工作。

答案 2 :(得分:0)

您需要将输入的值存储到response字段中,并将它们适当地应用于显示的单元格。例如,如果用户在单元格中键入内容,则可以使用NSMutableArray将响应保存在相应的索引中。

然后,当您在cellForRowAtIndexPath:

中显示您的单元格时
response = (UITextField *)[cell viewWithTag:102];
response.placeholder = [obj valueForKey:@"Question"];
response.text = responseValues[indexPath.row];

只需确保包含响应的阵列最初设置了适当数量的索引和空字符串。

您的文本在重复使用时在后续单元格中被复制的原因是因为您没有重置UITextField的内容,您只是在更改占位符。