我有一个带有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;
}
答案 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即可。这将解决问题。