1

所以我几乎完成了一个应该表现得像照片库的应用程序。尽管尝试正确删除照片,但我遇到了新手问题。所以,我有 3 个 UIImageViews。图像存储在 NSMutableArray 中,并在启动时从其中加载。他们删除并完美保存。但是,如果我要删除 UIImageView #2 中的图像,然后关闭并重新启动应用程序,则 UIImageView #3 中的图像会滑入 #2 的位置。一切都很好,直到我尝试删除 #2 位置的图像或 #2 之上的任何图像。

我根据名称删除照片,因此如果我尝试删除 UIImageView #2 中的照片,我的代码将搜索 Image2.png 并将其删除。但是,现在当我重新启动应用程序时,UIImageView #3 位于 #2 的位置,所以当我尝试删除 UIImageView #3 时,它不会删除,因为它正在寻找不再存在的 Image2.png。该位置的文件名为 Image3.png。所以,我有点不知所措,不知道如何编辑我的代码来解决这个问题。这是我正在使用的当前代码,这里的罪魁祸首是NSString *filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"Image%i.png",view.tag]];. (我已经标记了每个 UIImageView 并基于此删除):

- (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];

            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];

            NSError *error;

            [fileManager removeItemAtPath:filePath error:&error];

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

        }
        ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil;
    }   
    [self.user setObject:self.array forKey:@"images"];
}

这是我的完整 .m 文件仅供参考: https ://github.com/Joey502/Test-Thing/wiki/.m-Class-File

如果有人知道如何解决这个问题,那就太好了!

4

2 回答 2

3

您想要做的是创建另一个NSMutableArray,调用它fileNamesArray来存储与UIImageView存储在您的self.array.

启动应用程序时,您应该在将s添加到的同时存储每个文件名 ( NSStrings) 。然后,在您的删除功能中,当您从目录中删除对象并将其删除时,您还应该从. 因此,一旦从两个数组中删除了对象,它们都将移动相同的数量,并且每个文件名将对应于正确的图像视图。self.fileNamesArrayUIImageViewself.arrayUIImageViewself.arrayself.fileNamesArray

补充一点:删除图像时,您应该使用 的tag从中sender检索文件名,self.fileNamesArray然后使用该文件名删除物理文件,然后将其从阵列中删除(与图像视图一起)。这是您的删除功能应该是什么样的示例:

if (view) {
    [self.array removeObject:view]; //or you could do [self.array removeObjectAtIndex:alertView.tag];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSString *documentsPath = [paths objectAtIndex:0];

    NSString *filePath = [documentsPath stringByAppendingPathComponent:[self.fileNamesArray objectAtIndex:alertView.tag]];
    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSError *error;

    [fileManager removeItemAtPath:filePath error:&error];

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

    [self.fileNamesArray removeObjectAtIndex: alertView.tag];
}

更新以解决评论中提出的问题:

  1. 在您的applicationDidEnterBackground方法中,您将self.array再次添加所有图像视图。如果数组不为空怎么办?然后你只是添加不需要的项目。在这个方法中你唯一需要的就是最后两行。

  2. 在您的viewDidLoad方法中,您应该将fileName字符串添加到self.fileNamesArray,但您已经添加了imageView. 删除将图像视图添加到此数组的所有行,然后UIImage *loadedImage = [UIImage imageWithContentsOfFile:fullPath];添加此行[self.fileNamesArray addObject:fileName];

  3. 在您的删除函数中,此行缺少两个括号:NSString *filePath = [documentsPath stringByAppendingPathComponent:[self.fileNamesArray objectAtIndex:alertView.tag;. 应该是NSString *filePath = [documentsPath stringByAppendingPathComponent:[self.fileNamesArray objectAtIndex:alertView.tag]];。我想知道这是否是您的整个目录被删除的原因。

  4. 不要忘记,当您使用图像选择器添加图像时,您还应该将文件名添加到fileNamesArray您的选择器委托方法中(以正确的顺序)。

于 2012-04-24T00:37:16.090 回答
1

检查您对 self.array 的使用。有时您使用它来存储/检索 UIImageView,其他地方您正在存储/检索图像视图中的图像。

如果您尝试将 self.array 用于两个不同的目的,那么您需要在切换目的时释放并分配一个新的,或者在切换到另一个目的之前删除所有当前内容。

于 2012-05-02T01:25:14.603 回答