iOS 如何从 UIImageView 中删除数组的两个图像

How to delete two images of an array from UIImageView in iOS

我有五个图像视图,我存储了 images.The 问题的数组,如果我从图像视图中删除第一张图像并且它没有删除 correctly.Here 我的图像索引是相同的选择并删除下一张图片后,我收到类似

的错误
[__NSArrayI objectAtIndex:]: index 3 beyond bounds 2

我的代码片段在这里:

 -(void)viewWillAppear:(BOOL)animated
 {

//[self change_header_colors];

[[NSMutableSet setWithArray:del_imgArray] minusSet:[NSSet setWithArray:assetImages]];


  del_imgArray = [[NSMutableArray alloc]init];

del_imgArray = [[[NSUserDefaults standardUserDefaults] objectForKey:@"del_arr"] mutableCopy];

for (int i=0; i<del_imgArray.count; i++)

{
   if ([[del_imgArray objectAtIndex:i] length] > 0)
    {
        NSLog(@"delete %d",i);

        [assetImages removeObjectAtIndex:i];

        UIImageView *thumb = (UIImageView*)[detailScrollView viewWithTag:i+6000];

        thumb.image = nil;

    }
}

//[self loadThumbs];

}       

** 由于未捕获的异常 'NSRangeException' 而终止应用程序,原因:'-[__NSCFArray removeObjectAtIndex:]: index (3) beyond bounds (2)'

[assetImages removeObjectAtIndex:i];

导致错误。因为您要根据 del_imgArray(i)

的索引删除 assetImages 的对象

你可以保留for循环。

for (int i=del_imgArray.count-1; i>=0; i--)
{
   if ([[del_imgArray objectAtIndex:i] length] > 0)
    {
        NSLog(@"delete %d",i);

        [assetImages removeObjectAtIndex:i];

        UIImageView *thumb = (UIImageView*)[detailScrollView viewWithTag:i+6000];

        thumb.image = nil;

    }
}

花了很长时间后,我和我的同事们发现了确切的错误,现在我正在 post 解决我的问题并解释我为什么会遇到这个问题。

错误:我已将 5 张图像上传到服务器并在本地保存在纪录片中 path.When 我删除了编辑页面中的图像,它比较了服务器和本地,所以我遇到了我在我的文章中提到的问题问题。

编辑页面:(viewwillappear)-我只需要删除本地图像,更新时我会删除每个图像和 post server.So 中的图像将保存在服务器中,我会再次保存在本地,我可以删除所有图像。

  #pragma mark - Download Asset Images

 //Asset images -saving locally in documentorypath.

 //img_ids(NSMutableArray)-Taking image id in an array


 -(void)download_Asset_Images
  {
  for (int r = 0; r < assetImages.count; r++)
 {
    NSString *str_id_key = [NSString stringWithFormat:@"image_id%d", r+1];
    NSString *str_id = [NSString stringWithFormat:@"%@", [[assetImages objectAtIndex:r]objectForKey:str_id_key]];
    [img_ids addObject:str_id];

    NSString *str_key = [NSString stringWithFormat:@"main_img%d", r+1];
    NSString *str_asset_img_url =[NSString stringWithFormat:@"%@",[[assetImages objectAtIndex:r]objectForKey:str_key]];
    [self download_img:str_asset_img_url img_name:[NSString stringWithFormat:@"downimg%d.jpg", r]];
}
NSLog(@"%@", img_ids);
}


-(UIImage *)getImageFromURL:(NSString *)fileURL
{
UIImage * result;
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
result = [UIImage imageWithData:data];
return result;
}


-(void)download_img:(NSString *)str_url img_name:(NSString *)str_name
 {
UIImage * imageFromURL = [self getImageFromURL:str_url];
[self saveImagetofolder:imageFromURL imageName:str_name];
}


- (void)saveImagetofolder:(UIImage*)s_image imageName:(NSString*)str_image
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/Asset_images"];
NSString* path = [dataPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", str_image]];
NSData* data = UIImageJPEGRepresentation(s_image, 1.0);
[data writeToFile:path atomically:YES];
 }


#pragma mark - Remove All Images

 -(void)removeallImages
 {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/Asset_images"];

NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dataPath error:nil];

for (NSString *filename in files)
{
    [[NSFileManager defaultManager] removeItemAtPath:[dataPath stringByAppendingPathComponent:filename] error:NULL];
}
 }


#pragma mark - Load Thumb Images
 -(void)new_loadThumbs
 {


NSArray *directoryNames = [NSArray arrayWithObjects:@"Asset_images",nil];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
for (int i = 0; i < [directoryNames count] ; i++)
  {
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:[directoryNames objectAtIndex:i]];
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil]; //Create folder

    NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dataPath error:nil];

    for (int i = 0; i < files.count; i++)
    {
        NSString *imageName=[files objectAtIndex:i];

        NSString *fileNumber = [[imageName componentsSeparatedByCharactersInSet:
                                 [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                                componentsJoinedByString:@""];

        NSString* path = [dataPath stringByAppendingPathComponent:imageName];
        UIImage* image = [UIImage imageWithContentsOfFile:path];

        UIImageView *thumb = (UIImageView*)[detailScrollView viewWithTag:[fileNumber intValue]+6000];
        thumb.image = nil;
        thumb.image = image;

        image_tag++;
    }
}
}

pragma mark - 加载资产图像

-(UIImage*)loadAssetImage:(NSString*)image_name
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Asset_images"];
NSString* path = [dataPath stringByAppendingPathComponent:image_name];
UIImage* image = [UIImage imageWithContentsOfFile:path];
return image;
 }