在cellForRowAtIndexPath中,将单元格保存到@property,始终是tableview中的最后一个单元格

时间:2014-09-20 23:19:03

标签: ios objective-c uitableview

使用以下委托方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    PLOTCheckinTableViewCell *cell = (PLOTCheckinTableViewCell *)[self.checkinsTableView dequeueReusableCellWithIdentifier:CheckinCellIdentifier forIndexPath:indexPath];
    [cell setSwipeGestureWithView:crossView color:redColor mode:MCSwipeTableViewCellModeSwitch state:MCSwipeTableViewCellState2 completionBlock:^(MCSwipeTableViewCell *cell, MCSwipeTableViewCellState state, MCSwipeTableViewCellMode mode) {
        self.indexPathToDelete = [tableView indexPathForCell:cell];
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Delete?"
                                                                    message:@"Are you sure your want to remove this checkin?"
                                                                   delegate:self
                                                          cancelButtonTitle:@"No"
                                                          otherButtonTitles:@"Yes", nil];
        [alertView show];
        }];
}

然后在UIAlertView委托方法中:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

// No
if (buttonIndex == 0) {

}

// Yes
else {
    PLOTCheckinTableViewCell *cell = (PLOTCheckinTableViewCell *)[self.checkinsTableView cellForRowAtIndexPath:self.indexPathToDelete];
    [self.checkins removeObjectAtIndex:self.indexPathToDelete.row];
    [self.checkinsTableView deleteRowsAtIndexPaths:@[self.indexPathToDelete] withRowAnimation:UITableViewRowAnimationFade];
    self.indexPathToDelete = nil;
}

}

但是,每当我在警报视图中点击“确定”时,被删除的单元格始终是tableview中的最后一个单元格,即。不是用户实际刷过的单元格。

是否与出局有关?

1 个答案:

答案 0 :(得分:1)

是。您不应该引用您的单元格。相反,尝试引用导致单元格存在的实际对象(即,如果这是消息列表,则显示在该单元格内的消息)。

正在重用单元对象,UIAlertView不会知道这一点。即使您的列表中有1000个项目,也不会超过20个单元格。它们总是会在您的表格视图滚动中重复使用。

您应该考虑从数据源数组中删除元素,而不是删除单元格本身。删除元素后,您始终可以重新加载表视图,以直观地反映元素删除状态。