1

これで、フォトギャラリーのように動作するはずのアプリがほぼ完成しました。写真を適切に削除しようとしていますが、初心者の問題が発生しています。したがって、3つのUIImageViewがあります。イメージは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呼び出して、.fileNamesArrayUIImageViewself.array

アプリを起動するときは、 に を追加すると同時に、NSString各ファイル名を に保存する必要があります。次に、削除機能で、ディレクトリからオブジェクトを削除して削除するときに、ファイル名も削除する必要があります。したがって、オブジェクトが両方の配列から削除されると、それらはすべて同じ量だけ移動し、各ファイル名は右側の画像ビューに対応します。self.fileNamesArrayUIImageViewself.arrayUIImageViewself.arrayself.fileNamesArray

それに追加するだけです:画像を削除するときは、tagsenderを使用してファイル名を取得し、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 行だけです。

  2. viewDidLoadメソッドでは、fileName文字列をに追加することになっていますself.fileNamesArrayが、imageView. この配列に画像ビューを追加するすべての行を削除し、この行を追加した後UIImage *loadedImage = [UIImage imageWithContentsOfFile:fullPath];[self.fileNamesArray addObject:fileName];

  3. 削除関数では、この行に 2 つの角かっこがありません: 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 を保存/取得するために使用することもあれば、画像ビューから画像を保存/取得する他の場所に使用することもあります。

2 つの異なる目的で self.array を使用しようとしている場合は、目的を切り替えるときに新しいものを解放して割り当てるか、他の目的に切り替える前に現在の内容をすべて削除する必要があります。

于 2012-05-02T01:25:14.603 に答える