UITableViewCell中的UITextfield文本在滚动时消失

时间:2015-05-17 19:55:41

标签: ios objective-c uitableview uitextfield

我将数据存储到我的每个自定义UITableView单元格中的NSUserDefaults中:

 for (int i = 0; i < additionalClaimants; i++)
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        UITableViewCell *cell = [self.table_view cellForRowAtIndexPath:indexPath];
        UITextField* firstNameField = (UITextField *)[cell viewWithTag:1];
        UITextField* employeeIDField = (UITextField *)[cell viewWithTag:2];

        [defaults setObject:firstNameField.text forKey:[NSString stringWithFormat:@"claimant%d_name",i+1]];
        [defaults setObject:employeeIDField.text forKey:[NSString stringWithFormat:@"claimant%d_employeeID",i+1]];


    }
    [defaults setInteger:additionalClaimants forKey:@"total_add_claimants"];
    [defaults synchronize];

我在cellForIndexPath方法中显示UITableView中的数据:

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    AdditionalClaimantsTableViewCell *cell = [self.table_view
                             dequeueReusableCellWithIdentifier:@"Cell"];

    NSString *claimant_name = [defaults objectForKey: [NSString stringWithFormat:@"claimant%ld_name", (long)indexPath.row+1]];
    NSString *claimant_employeeID = [defaults objectForKey: [NSString stringWithFormat:@"claimant%ld_employeeID", (long)indexPath.row+1]];

    cell.txtField_eid.text = claimant_employeeID;
    cell.txtField_name.text = claimant_name;

    return cell;
}

问题是在滚动时,视图外显示的文本域似乎丢失了其中的数据。

2 个答案:

答案 0 :(得分:2)

cellForRowAtIndexPath中的代码很好(需要说明您要使用的dequeueReusableCellWithIdentifier版本)。您的问题在于for循环,您尝试保存值。如果您调试此for循环,您会发现cell对于屏幕上不再显示的任何行都是nil。您需要找到一种方法来保存每行的值,然后在屏幕滚动之前(或尽快)。为此,请使用tableView委托方法:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

检查并保存该方法中的textField值。

您仍需要保存任何可见单元格的值。您现有的for循环将实现这一点,但是您可以通过使用tableView的visibleCells属性来获取单元格数组并对其进行迭代(这将避免为不可见的行构建indexPath)来稍微优化它。

答案 1 :(得分:0)

  

问题是在滚动时,看起来不在视野中的文本字段   丢失其中的数据。

表视图中的屏幕外单元确实没有。不是你想象他们的方式。一旦单元格在屏幕外滚动,它将成为再次在屏幕上移动的下一个单元格。它排队等待重用,-dequeueReusableCellWithIdentifier:call抓取它再次用于显示表中的另一行。

所以永远不要将数据分配给表视图单元格,除非在-tableView:cellForRowAtIndexPath:委托调用中。永远。真。相信我。