UITextFields在UITableView中,输入的值重新出现在其他单元格中

时间:2011-05-29 19:30:00

标签: iphone objective-c cocoa-touch uitableview

我有一个UITableView,大约有20个单元格,每个单元格中有三个UITextFields。我没有子类UITableViewCell,但在设置每个单元格时,我将textfields标记值设置为常量加上行号。因此,对于每一行,文本字段的标记都会加1。

当我运行应用程序并在例如第一行中输入值时,它可能会重新出现在第12行。每次运行应用程序时行为都不一样。

我应该补充一点,我有一个数组存储在每个文本字段中输入的内容。编辑文本字段时,我将新值保存到数组中,当tableview再次请求单元格时,我将textfields值设置为存储在数组中的值。

这与重用UITableViewCells有关吗? 重用单元格时,不同行中的文本字段是否可以获得相同的标记号?比如说第一个单元格(textfield tag = 1001)在第12行重用,然后我们有两个具有相同标签号的文本字段。如果我然后在第1行输入一个值,然后加载第12行,则第一个单元格中的值将从数组加载并放入第12行。

如果发生这种情况,我该如何解决? 每个单元格都没有对文本字段的引用,所以我不认为我可以通过访问它所在的单元格来编辑文本字段的标记值。

编辑:

以下是UITableView的代码:cellForRowAtIndexPath:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            //Modify cell, adding textfield with row-unique index value
            cell = [self modifyCellForHoleInfo:cell atIndexPath:indexPath];

    }
    cell.accessoryType = UITableViewCellAccessoryNone; 

    // Load value for textfield stored in dataArray
    ((UITextField *)[cell viewWithTag:1000+indexPath.row]).text = [dataArray objectAtIndex:indexPath.row];

谢谢!

2 个答案:

答案 0 :(得分:6)

问题是当重用单元格时(即dequeueReusableCellWithIdentifier返回非零值),将返回包含现有UITextView的单元格。要保持代码的唯一性,最好删除之前的UITextField

- (void)removeExistingTextSubviews:(UITableViewCell *)cell
{
    NSMutableArray *toRemove = [NSMutableArray array];
    // I don't know if you have non-TextField subviews
    for (id view in [cell subviews]) {
        if ([view isKindOfClass:[UITextField class]] && view.tag >= 1000) {
           [toRemove insert:view];
        }
    }

    for (id view in toRemove) {
        [toRemove removeFromSuperView];
    }
}

...

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
} else {
    [self removeExistingTextSubviews:cell];
}
//Modify cell, adding textfield with row-unique index value
cell = [self modifyCellForHoleInfo:cell atIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryNone; 

// Load value for textfield stored in dataArray
((UITextField *)[cell viewWithTag:1000+indexPath.row]).text = [dataArray objectAtIndex:indexPath.row];

请注意,我没有编译代码,但它应该作为起点。

答案 1 :(得分:1)

只需通过标签文本将文本字段文本转换为字典setObject,然后再按标签检查文本将文本分配给相应的Textfield ..这是我的代码......

//In Interface
NSMutableDictionary *amounts;
amounts =[[NSMutableDictionary alloc]init];

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

static NSString *CellIdentifier = @"MoneyEntryIdentifier";
static NSString *CellNib = @"MoneyEntry";
MoneyEntryTableViewCell *cell = (MoneyEntryTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (!cell)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
cell = (MoneyEntryTableViewCell *)[nib objectAtIndex:0];
}

UILabel     *lblname  = (UILabel *)    [cell lblMemName];
lblname.tag =100;
UITextField *txtfield = (UITextField *)[cell textAmount];
txtfield.tag =indexPath.row;

[txtfield addTarget:self  action:@selector(textFieldDidChange:)    forControlEvents:UIControlEventEditingChanged];
lblname.text = tabledata[indexPath.row];
txtfield.placeholder = [NSString stringWithFormat:@"%ld",(long)indexPath.row];


if ([amounts valueForKey:lblname.text] != nil) {
 txtfield.text = [amounts valueForKey:lblname.text];
} else {
 txtfield.text = @"";
}

cell.selectionStyle =UITableViewCellSelectionStyleNone;
return cell;
}

 -(void)textFieldDidChange:(UITextField *)txtField
 {
 UILabel *label = (UILabel *)[txtField.superview viewWithTag:100];
 NSString *labelString = label.text;
 NSString *textFieldString = txtField.text;
 [amounts setObject:textFieldString forKey:labelString];
 }

将笔尖更改为您的tableview单元格......