dequeReusableCellWIthIdentifier:加载用户先前删除的单元格

时间:2014-08-14 16:08:03

标签: ios uitableview

我正在写一个小提醒应用。当用户尝试设置新提醒时,会出现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的全局变量来保持单元格的总数。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您需要重置单元格,而不是删除它。通过覆盖prepareForReuse方法更新它的视图。

来自official documentation

  

准备可重用的单元格以供表格视图的委托重用。

     

- (void)prepareForReuse

     

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 则调用此方法   就在从UITableView方法返回对象之前   dequeueReusableCellWithIdentifier :.出于性能原因,你   应该只重置与之无关的单元格的属性   内容,例如,alpha,编辑和选择状态。桌子   tableView中的view委托:cellForRowAtIndexPath:应该总是如此   重新使用单元格时重置所有内容。如果单元格对象没有   具有关联的重用标识符,不调用此方法。如果你   重写此方法,您必须确保调用超类   实施

     

可用性适用于iOS 2.0及更高版本。