我正在写一个小提醒应用。当用户尝试设置新提醒时,会出现UITableView
,其中不同的部分是关于用户编辑的提醒的不同方面。其中一个部分我想拥有动态行,因此用户可以单击第一个单元格中的加号,另一个单元格将显示在其下方。一旦发生这种情况,红色x符号将替换第一个单元格中的加号,以便用户也可以删除该单元格。我遇到的问题是,当删除一个单元格时,我正在调用-deleteAtIndexPaths:withRowAnimation:
,但似乎该单元格正被放入可重用的队列而不是实际被释放。我知道这一点,因为当删除单元格但用户再次单击加号时,该单元格中的旧信息(包括红色x符号)位于-dequeReusableCellWIthIdentifier:
的新单元格中。当我希望它取消分配时,我无法找到一种方法来阻止它排队。这是我的tableView:cellForRowAtIndexPath:这与我正在讨论的单元格有关。
static NSString *identifier2 = @"addTime";
ReminderAddTimeTableViewCell *cell2 = [self.tableView dequeueReusableCellWithIdentifier:identifier2];
if (cell2 == nil) {
NSArray *cellnib = [[NSBundle mainBundle] loadNibNamed:@"ReminderAddTimeTableViewCell" owner:self options:nil];
cell2 = (ReminderAddTimeTableViewCell *)[cellnib objectAtIndex:0];
[cell2.extra addTarget:self action:@selector(addTimeCell:) forControlEvents:UIControlEventTouchUpInside];
cell2.extra.tag = indexPath.row;
cell2.selectionStyle = UITableViewCellSelectionStyleNone;
}
return cell2;
这里有IBAction
个方法,分别对应于添加和删除单元格:
-(IBAction)addTimeCell:(UIButton*)sender{
timeCellCount ++;
NSIndexPath *path = [NSIndexPath indexPathForRow:sender.tag+1 inSection:1];
NSArray *array = [NSArray arrayWithObjects:path,nil];
[self.tableView insertRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationRight];
[sender setImage:[UIImage imageNamed:@"red-x.png"] forState:UIControlStateNormal];
[sender removeTarget:self action:@selector(addTimeCell:) forControlEvents:UIControlEventTouchUpInside];
[sender addTarget:self action:@selector(removeTimeCell:) forControlEvents:UIControlEventTouchUpInside];}
-(IBAction)removeTimeCell:(UIButton*)sender{
for(int i = sender.tag+1; i <= timeCellCount; i++){
((ReminderAddTimeTableViewCell*)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:1]]).extra.tag --;
}
timeCellCount --;
[sender setImage:[UIImage imageNamed:@"green-plus.png"] forState:UIControlStateNormal];
[sender removeTarget:self action:@selector(removeTimeCell:) forControlEvents:UIControlEventTouchUpInside];
[sender addTarget:self action:@selector(addTimeCell:) forControlEvents:UIControlEventTouchUpInside];
NSIndexPath *path = [NSIndexPath indexPathForRow:sender.tag inSection:1];
NSArray *array = [NSArray arrayWithObjects:path,nil];
[self.tableView deleteRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationRight];
}
我已经标记了按钮,因此我知道我正在处理的是哪个单元格,以及设置一个名为timeCellCount的全局变量来保持单元格的总数。在此先感谢您的帮助!
答案 0 :(得分:2)
您需要重置单元格,而不是删除它。通过覆盖prepareForReuse
方法更新它的视图。
准备可重用的单元格以供表格视图的委托重用。
- (void)prepareForReuse
如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 则调用此方法 就在从UITableView方法返回对象之前 dequeueReusableCellWithIdentifier :.出于性能原因,你 应该只重置与之无关的单元格的属性 内容,例如,alpha,编辑和选择状态。桌子 tableView中的view委托:cellForRowAtIndexPath:应该总是如此 重新使用单元格时重置所有内容。如果单元格对象没有 具有关联的重用标识符,不调用此方法。如果你 重写此方法,您必须确保调用超类 实施
可用性适用于iOS 2.0及更高版本。