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

UITextfield text inside UITableViewCell disappearing on scroll

我正在像这样从我的每个自定义 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];

我在 UITableView 中显示数据,就像在 cellForIndexPath 方法中一样:

-(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;
}

问题是滚动时,出现在视图之外的文本字段似乎丢失了其中的数据。

Problem is when scrolling, the textfields that appear off view seem to lose the data in them.

table 视图中确实没有屏幕外单元格之类的东西。不是你想象的那样。一旦一个单元格滚动到屏幕外,它就会成为下一个再次移动到屏幕上的单元格。它排队等候重用,并且 -dequeueReusableCellWithIdentifier: 调用会再次使用它来显示 table.

中的另一行

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

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

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

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

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