UITableView插入旧数据

时间:2013-01-10 22:45:16

标签: iphone ios objective-c uitableview

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

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

这是在编辑单元格中的一个UITextField时调用的fieldChanged:方法(其中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;
}

2 个答案:

答案 0 :(得分: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;
}

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

已更新

文本字段本身不适合保留数据。从这里的问题可以看出,该体系结构排除了它,因为它们在屏幕上滚动(或被移除/添加)时重复使用。一种方法是创建一个数组并将这些文本字段的内容存储为字符串。

答案 1 :(得分:0)

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