从NSMutableArray中删除图像

时间:2012-04-16 02:40:43

标签: objective-c ios uiimageview nsmutablearray

因此,我正在编写的应用程序允许用户从相机胶卷上传照片,并在UIImageView中显示。我有一个“保存”按钮,可以在按下时保存图像。我也有一个“编辑”按钮,当点击时,它允许用户点击照片,它将被删除。这是我遇到问题的地方,图像从视图中删除,但似乎没有从数组中删除。当我关闭并重新启动应用程序时,照片会再次出现。我对Objective-C很新,我很惊讶我甚至做到了这一点,所以我在解决如何从阵列中删除它时遇到了问题。

另外,作为旁注,如果我从相机胶卷中抓取3张图像,删除中间的图像,然后按下保存按钮,关闭并重新启动应用程序后,它只会显示2张照片。如果我先按保存,然后尝试删除它们,则会在重新启动后再次出现图像时出现问题。

这就是我删除它们的方式。我在每个UIImageView上都有一个隐形按钮,当按下Edit按钮时,它会取消隐藏它们。我已经标记了按钮和UIImageViews,当按下其中一个按钮时,会触发:

- (IBAction)deleteButtonPressed:(id)sender {
    UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:@"Delete"
                                                              message:@"Are you sure you want to delete this photo?"
                                                             delegate:self
                                                    cancelButtonTitle:@"No"
                                                    otherButtonTitles:@"Yes", nil];
    [deleteAlertView show];

    int imageIndex = ((UIButton *)sender).tag;
    deleteAlertView.tag = imageIndex;
}

- (UIImageView *)viewForTag:(NSInteger)tag {
    UIImageView *found = nil;
    for (UIImageView *view in self.array) {
        if (tag == view.tag) {
            found = view;
            break;
        }
    }
    return found;
}

- (void)alertView: (UIAlertView *) alertView 
clickedButtonAtIndex: (NSInteger) buttonIndex
{


    if (buttonIndex != [alertView cancelButtonIndex]) {

        UIImageView *view = [self viewForTag:alertView.tag];
        if (view) {
            [self.array removeObject:view];
        }

        ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil;
    }

    [self.user setObject:self.array forKey:@"images"];
}

仅供参考,这就是我保存图片的方式:

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
        if (imageView.image == nil) {
            imageView.image = img;

            [self.array addObject:imageView];

            [picker dismissModalViewControllerAnimated:YES];
            [self.popover dismissPopoverAnimated:YES];

            return;

        }

        if (imageView2.image == nil) {
            imageView2.image = img;
            NSLog(@"The image is a %@", imageView);
            [self.array addObject:imageView2];

            [picker dismissModalViewControllerAnimated:YES];
            [self.popover dismissPopoverAnimated:YES];

            return;
        }
        ...
        ...
        }

    -(IBAction)saveButtonPressed:(id)sender {
        NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) objectAtIndex:0];



        for (UIImageView *imageViewToSave in self.array) {

            NSInteger tag = imageViewToSave.tag;
            UIImage *image = imageViewToSave.image;
            NSString *imageName = [NSString stringWithFormat:@"Image%i.png",tag];

            NSString *imagePath = [docsDir stringByAppendingPathComponent:imageName];

            [UIImagePNGRepresentation(image) writeToFile:imagePath atomically:NO];
        }

    }

这就是我加载它们的方式:

    -(void)viewDidLoad {

        self.array = [NSMutableArray array];
        NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];

        NSArray *docFiles = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:docsDir error:NULL];

        for (NSString *fileName in docFiles) {

            if ([fileName hasSuffix:@".png"]) {
                NSString *fullPath = [docsDir stringByAppendingPathComponent:fileName];
                UIImage *loadedImage = [UIImage imageWithContentsOfFile:fullPath];

                if (!imageView.image) {
                    imageView.image = loadedImage;
                } 
                else if (!imageView2.image) {
                    imageView2.image = loadedImage;
                  }
                else if (!imageView3.image) {
                    imageView3.image = loadedImage;

                }

            }
        }
    }

更新:这是我目前的代码:

- (IBAction)deleteButtonPressed:(id)sender {
    NSLog(@"Sender is %@", sender);
    UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:@"Delete"
                                                              message:@"Are you sure you want to delete this photo?"
                                                             delegate:self
                                                    cancelButtonTitle:@"No"
                                                    otherButtonTitles:@"Yes", nil];
    [deleteAlertView show];

    int imageIndex = ((UIButton *)sender).tag;
    deleteAlertView.tag = imageIndex;
}

- (UIImageView *)viewForTag:(NSInteger)tag {
    UIImageView *found = nil;
    for (UIImageView *view in self.array) {
        if (tag == view.tag) {
            found = view;
            break;
        }
    }
    return found;
}

- (void)alertView: (UIAlertView *) alertView 
clickedButtonAtIndex: (NSInteger) buttonIndex
{


    if (buttonIndex != [alertView cancelButtonIndex]) {

        UIImageView *view = [self viewForTag:alertView.tag];
        if (view) {
            [self.array removeObject:view];

            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
            NSString *documentsPath = [paths objectAtIndex:0];
            NSString *filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"Image%i.png",view.tag]];
            NSFileManager *fileManager = [NSFileManager defaultManager];
            [fileManager removeItemAtPath:filePath error:NULL];
        }

        ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil;
    }

    [self.user setObject:self.array forKey:@"images"];
}

2 个答案:

答案 0 :(得分:2)

你的数组与此无关。无论如何,它会在下次发布时被覆盖。我认为您不会从文件夹中删除您的图像,因此在viewDidLoad方法的下次启动时会再次读取该图像。

答案 1 :(得分:2)

当您从阵列[self.array removeObject:view];中删除图像时,您尚未从目录中删除图像。

array删除对象后,您可能需要执行以下操作:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *documentsPath = [paths objectAtIndex:0];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"THE_IMAGE_NAME_HERE.png"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
[fileManager removeItemAtPath:filePath error:&error];

if (error)
NSLog(@"Error: %@",error);