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;
}
我有五个图像视图,我存储了 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;
}