这是我应用的流程:我有UICollectionview的图片缩略图。用户在“保存”按钮上选择图像和点击。图像将保存到相机胶卷。
这就是我想要做的事情:使用子视图我想标记用户已经点击并保存的那些单元格。我如何实现这一目标?
这就是我已经做过的......我的方法:显然我错过了一些东西而且我无法解决问题。
当用户点击保存按钮时,我使用核心数据成功将这些图像的ID保存到本地存储。然后,我从该实体获取对象并将这些对象放在Array中。现在,我尝试将获取数组中的图像ID与集合视图中的图像ID进行比较,因此我只能将子视图添加到ID匹配的那些单元格以及我卡住的位置。我不知道这是否是正确的做法。
我的愚蠢尝试:
当用户点击“保存”按钮但是它无法正常工作时,会调用此方法。我觉得它随机添加了子视图。
-(void)markSavedImages
{
BOOL isMarked;
NSArray *savedImages = [self fetchSavedPhotos];
NSEnumerator *enumerator = [savedImages objectEnumerator];
NSString *savedImage;
while (savedImage = [enumerator nextObject]) {
if ([[self.eventPhotos valueForKey:@"id"] containsObject:savedImage]) {
isMarked = YES;
}
else
{
isMarked = NO;
}
}
CVCell *cell = [[CVCell alloc]init];
for (NSIndexPath *indexPath in self.livePhotosCollectionView.indexPathsForVisibleItems) {
if (isMarked) {
cell = (CVCell*)[self.livePhotosCollectionView cellForItemAtIndexPath:indexPath];
UIImageView *markedImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"markedCVCell.png"]];
[cell addSubview:markedImage];
[cell bringSubviewToFront:markedImage];
cell.userInteractionEnabled = NO;
}
}
}
self.eventPhotos
是一个包含图片ID和服务器路径的数组。
请帮助我们,我一直在用自己杀死自己,在谷歌上找不到任何东西。
编辑 - 根据要求
-(NSArray*)fetchSavedPhotos
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Photos" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"eventID ==[c] %@", _eventID];
[fetchRequest setPredicate:predicate];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
NSLog(@"No rows returned");
}
NSArray *savedImages = [fetchedObjects valueForKey:@"imageID"];
return savedImages;
}
更多信息......如果我在markSavedImages方法中输出savedImages数组,我会得到我想要的数组。像这样:(1324,2353,2324)。基本上是图像ID数组。
答案 0 :(得分:2)
首先,不要只为某些单元格添加视图。这通常导致视图显示在重用的单元格上,并且视图的多个副本被添加到单元格中,这看起来令人困惑且效率低下。
相反,将视图添加到每个单元格。在您的单元子类中执行此操作并使视图公开可见,或添加一个方法来显示和隐藏它。然后就这样做。每次返回单元格时,请设置子视图的可见性。这样可以确保始终正确配置单元格,并确保配置代码简单。
要禁用单元格,请使用类似的方法,始终选择是否启用单元格,并在整个单元格上设置启用的用户交互。
对于您的数据,您有一个源图像ID列表和已保存图像ID的列表。配置单元格时,您知道关联的图像ID。要检查是否应标记和禁用单元格,您可以执行以下操作:
BOOL saved = [self.savedImages containsObject:imageId];
(将当前id与所选id列表进行比较,不要进行任何循环)。