我有一个带有 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;
}