0

我有一个带有 1 部分的简单 UITableView,其中存在任意数量的KMInputCell带有 UITextFields 的自定义 UITableViewCells (类型)的行。当用户开始在最后一个(空白)文本字段中输入时,会插入一个新的空白行(因此用户可以创建一个类似列表的结构)。由于我只会在视图关闭时“保存”数据,因此数据源只是NSUInteger跟踪行数。

在用户从表中删除一行之前,我的代码可以正常工作。然后,当用户开始在列表末尾键入并且应该插入一个新的(空白)行时,插入的 UITableView 单元格包含来自已删除单元格的旧数据。更糟糕的是,当多行被删除然后用户开始输入(并且应该插入一个空白行)时,多行被删除的行会突然出现。

这是在fieldChanged:编辑单元格中的一个 UITextField 时调用的方法(self.last_cell返回该部分中的最后一个单元格):

- (IBAction)fieldChanged:(id)sender {
    // get the text field of the last row
    // if it has a value that is not blank, insert another row
    KMInputCell* last_cell = self.last_cell;
    if(![last_cell.textField.text isEqualToString:@""]){
        [self.tableView beginUpdates];
        NSIndexPath* new_cell_path = [NSIndexPath indexPathForItem:[self.tableView numberOfRowsInSection:0] inSection:0];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:new_cell_path] withRowAnimation:UITableViewRowAnimationAutomatic];
        number_emails++;
        [self.tableView endUpdates];
    }
}

commitEditingStyle:是用于删除单元格的方法:

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        number_emails--;
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
     }   
}

添加

这里是cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"add_email_prototype";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];=

    // Configure the cell...

    return cell;
}
4

2 回答 2

1

我不太清楚你的数据模型的细节......仅仅跟踪一个整数并不是一个很好的方法 - 但也许我只是不明白你在做什么。您是否有代表这些行的模型数组或模型对象,或者您只是跟踪其字段中的文本?

您正在插入新行,但问题可能与 UITableViewCells 在呈现时被重用的事实有关。如果这确实是这里的问题,您可能需要更新此处未提供的方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    return cell;
}

这应该是您用来填充文本字段的方法。还必须明确清除任何动态字段的内容,以便在重新使用表格单元格时不会在其中获得意外内容。

更新

文本字段本身不适合保留数据。正如您从这里的问题中看到的那样,该体系结构将其排除在外,因为当单元格在屏幕上下滚动(或被删除/添加)时,它们会被重复使用。一种做法是创建一个数组并将这些文本字段的内容作为字符串存储在其中。

于 2013-01-10T22:59:56.510 回答
0

在 cellForRowIndex 函数中,只需将它们初始化为 nil。这将解决问题。

于 2013-01-11T07:04:38.760 回答