我正在创建一个看起来像(图-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保留已删除的视图。请帮助。
答案 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;
}