UICollectionView在插入之前删除单元格的位置时不重绘单元格

时间:2013-12-28 21:40:14

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

我正在创建一个看起来像(图-1)的UICollectionView控件:

我添加了通过向右滑动单元格来删除单元格的功能。

我的问题案例 - 如果我通过滑动删除最后一个单元格(图2),这将调用以下代码。

- (void)removeTheCell:(AnyObject *)obj {

    // remove the object
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:[self.allObjects indexOfObject:obj] inSection:0];

    [self.allObjects removeObjectAtIndex:indexPath.row];


    [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
}

然后使用以下方法添加具有不同颜色的新单元格(图-4):

- (void)addNewObject:(NSNotification *)notification {

    NSDictionary *dict = notification.userInfo;
    NSArray *newObjects_a = [dict objectForKey:ALL_OBJECTS];

    NSMutableArray *indexArrays = [[NSMutableArray alloc] init];
    for (AnyObject *obj in newObjects_a) {
        [self.allObjects addObject:obj];
        [indexArrays addObject:[NSIndexPath indexPathForItem:[self.allObjects indexOfObject:obj] inSection:0]];
    }


    [self.collectionView performBatchUpdates:^{

        [self.collectionView insertItemsAtIndexPaths:indexArrays];

    } completion:nil];

}

显示的单元格仍然看起来像旧的已删除单元格的最后状态(图-4)。但我检查了数据源,它不包含已删除的对象。它包含最新数据。

(图-5)如果我通过选择调用以下方法的段控件来更改列表布局:

- (IBAction)SwitchCellFrames:(id)sender {

    int selection = ((UISegmentedControl *)sender).selectedSegmentIndex;

    isGridView = selection == 0 ? YES : NO;

    if (isGridView) {
        [self.collectionView setCollectionViewLayout:gridFlowLayout animated:YES];
    }else {
        [self.collectionView setCollectionViewLayout:listFlowLayout animated:YES];
    }

}

布局变量定义为:

    gridFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [gridFlowLayout setItemSize:CGSizeMake(160, 155)];
    [gridFlowLayout setMinimumInteritemSpacing:0.0f];
    [gridFlowLayout setMinimumLineSpacing:0.0f];
    [gridFlowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];


    listFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [listFlowLayout setItemSize:CGSizeMake(320, 80)];
    [listFlowLayout setMinimumInteritemSpacing:0.0f];
    [listFlowLayout setMinimumLineSpacing:0.0f];
    [listFlowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];

collectionView现在用正确的颜色更新新单元格(图-5 /图-6)。

我尝试了[self.collectionView setNeedsDisplay] / [self.collectionView setNeedsLayout] / [self.collectionView reloadData]。这些不会导致UI重绘。

我不知道是什么原因导致UICollectionView保留已删除的视图。请帮助。

enter image description here

1 个答案:

答案 0 :(得分:0)

在这种情况下找到了适合我的工作:

我正在我的customCell类的- (void)awakeFromNib()下创建和更新ui。因此,当新单元格添加到先前删除单元格的位置时,- (void)awakeFromNib()未被再次调用,并且正在返回先前的单元格副本。

因此,我公开了ui更新方法并将其从- (void)awakeFromNib()中删除。从cellForItemAtIndexPath显式调用UI更新方法为我解决了问题。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    CustomViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionCell" forIndexPath:indexPath];

    cell.obj = [self.allObjects objectAtIndex:indexPath.row];
    [cell handleChangesForLayoutAndPosition];
    [cell updateUI];
    [cell resetScrollView];

    cell.delegate = self;

    return cell;
}