2012-04-16 130 views
0

因此,我正在编写的应用程序允许用户从其相机胶卷上传照片,并将其显示在UIImageView中。我有一个“保存”按钮,可以在按下时保存图像。我也有一个“编辑”按钮,点击时,它允许用户点击照片,它将被删除。这是我遇到的问题,图像从视图中删除,但似乎没有从数组中删除。当我关闭并重新启动应用程序时,照片再次出现。我对Objective-C非常陌生,我很惊讶我甚至做到了这一点,所以我在解决如何从数组中删除它的问题。另外,作为一个附注,如果我从相机胶卷中抓取3张图像,删除中间的一张,然后按下保存按钮,关闭并重新启动应用程序后,它只会显示应该显示的2张照片。关于重新启动后图像再次出现的问题仅在先按下保存,然后尝试删除它们时才会出现。从NSMutableArray中删除图像

这就是我要如何删除它们。我在每个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

当您从数组[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); 
+0

感谢您的回答。所以,我应该添加[fileManager removeItemAtPath:查看错误:NULL];在[self.array removeObject:view];?下对于新手问题抱歉,对此仍然很陌生。 – John 2012-04-16 18:02:48

+1

我编辑了答案来显示一个例子。 – sooper 2012-04-16 18:27:42

+0

非常感谢。对于'stringByAppendingPathComponent',我应该简单地使用'view'吗?我使用'view'来确定哪个UIImageView被删除的标签。 – John 2012-04-17 01:27:06

2

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

+0

啊是啊,这是有道理的,谢谢。我认为'[self.array removeObject:view];'和'((UIImageView *)[self.view viewWithTag:alertView.tag])。image = nil;'会做的伎俩。你知道我需要添加什么来从文件夹和数组中删除图像吗?对于新手的问题再次抱歉,当我去这里时,我仍然在学习。 – John 2012-04-16 03:41:10

+0

图像不是文件参考,它是指向存储图像的内存位置的指针。您必须使用nsfilemanager显式删除文件。 – borrrden 2012-04-16 04:42:10

+0

谢谢。所以,我应该添加'[fileManager removeItemAtPath:view error:NULL];'''[self.array removeObject:view];'? – John 2012-04-16 16:00:44