0

だから、私が書いているアプリは、ユーザーがカメラロールから写真をアップロードできるようにし、UIImageView に表示します。「保存」ボタンがあり、押すと画像を保存できます。「編集」ボタンもあります。タップすると、ユーザーは写真をタップして削除できます。これは私が問題を抱えている場所です。画像はビューから削除されますが、アレイからは削除されないようです。アプリを閉じて再起動すると、写真が再び表示されます。私はObjective-Cに非常に慣れていません。ここまでできたことに驚いているので、配列から削除する方法を理解するのに問題があります。

また、補足として、カメラ ロールから 3 つの画像を取得し、中央の画像を削除してから保存ボタンを押すと、アプリを閉じて再起動した後、本来のように 2 つの写真のみが表示されます。再起動後に画像が再び表示されるという問題は、最初に保存を押してから削除しようとした場合にのみ発生します。

これが私がそれらを削除する方法です。各 UIImageView の上に非表示のボタンがあり、[編集] ボタンを押すと、それらが再表示されます。ボタンと UIImageViews の両方にタグを付けました。ボタンの 1 つが押されると、これが起動します。

- (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"];
}
4

2 に答える 2

2

あなたの配列はこれとは何の関係もありません。とにかく、次の起動時に上書きされます。フォルダーから画像を削除しているとは思わないので、次回の起動時に viewDidLoad メソッドで再度読み取られます。

于 2012-04-16T02:56:05.573 に答える
2

array からイメージを削除する場合[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);
于 2012-04-16T02:57:12.437 に答える