カメラから撮影した写真が保存されている配列がありますが、アプリを閉じるか最小化すると、次にアプリを起動したときにすべて消えてしまいます。これを修正する最良の方法は何ですか?
2 に答える
画像を配列に追加する代わりに、次のように画像をアプリ ドキュメント フォルダーに保存してみませんか。
//Save Image to Documents Directory
UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
NSString *imagePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/image.jpg"]];
[UIImageJPEGRepresentation(image, 1.0) writeToFile:imagePath atomically:YES];
アプリを使用しているときはいつでも、いつでも画像にアクセスできるようになりました。
更新 #1:
複数の画像があり、ドキュメント ディレクトリに保存されている画像を上書きしたくないとします。私は次のようなことをします:
最初に現在の日付と時刻を返すメソッドを作成します
- (NSString *)currentDateandTime
{
NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMddyyyy_HHmmssSS"];
NSString *dateString = [dateFormat stringFromDate:today];
[dateFormat release];
return dateString;
}
ご覧のとおり、日付はミリ秒単位で表示されるため、画像が上書きされる可能性がなくなります。メソッドを呼び出すには、以下を参照してください。
//Set Photo Date
NSString *date = [self currentDateandTime];
Now onto saving the image:
//Save Image to Documents Directory
UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
NSString *imagePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@_image.jpg",date]];
[UIImageJPEGRepresentation(image, 1.0) writeToFile:imagePath atomically:YES];
上記を実行すると、画像に一意のファイル名が作成されました。例: 10212012_12182245_image.jpg
画像を取得します。画像を保存する際に、ファイル名を .PLIST ファイルなどに保存する必要もあります。ファイル名の配列を作成し、それらを PLIST ファイルとしてディスクに保存できます。次に、すべての画像を日付で並べ替えたり、日付ごとにロードしたりします。
更新 #2:
さて、PLIST を作成して保存します。画像ピッカーが読み込まれるときにこれを呼び出すことができます。
- (void)createPLIST
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [path objectAtIndex:0];
NSString *plistPath = [documentsDirectory stringByAppendingString:@"/images.plist"];
//Check to see if the file exists, if not create the file.
if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]){
//Creating empty Image Files Array for later use
NSMutableArray *imageArray = [[NSMutableArray alloc] init];
[imageArray writeToFile:plistPath atomically:YES];
[imageArray release];
}
}
これで PLIST が作成されました。画像を保存するときに PLIST をロードしてからデータを書き込む必要があります。写真を撮るたびに呼び出される別のメソッドを作成することをお勧めします。1.) 写真を撮ります 2.) ファイル名に日付と時刻を付けて写真を保存します 3.) その日付オブジェクトを以下のメソッドに渡します。以下のメソッドは、ディクショナリに値を追加し、ディクショナリをドキュメント ディレクトリに保存します。また、すべてをドキュメント フォルダーに保存しているため、すべての情報がバックアップされるため、アプリをアップグレードするときにユーザーが画像を失うことはありません。
- (void)createNewGalleryObject:(NSString *)date
{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [path objectAtIndex:0];
NSString *plistPath = [NSString stringWithFormat:@"%@/images.plist", documentsDirectory];
//Load PLIST into mutable array
NSMutableArray *imageArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
//Create a dictionary for each image captured that saves basic information about the file for later use
NSMutableDictionary *newEntry = [[NSMutableDictionary alloc] init];
[imageArray addObject:newEntry];
//This is where we write to the dictionary, it is up to you what values to save.
//Based on what you told me I would save the information shown below.
//For example Later you can do things like sort by date.
[newEntry setValue:[NSDate date] forKey:@"Date"];
[newEntry setValue:[NSString stringWithFormat:@"Documents/%@_originalImage.jpg",date] forKey:@"Original Image"];
//Now save the array back to the PLIST, the array now contains a new dictionary object.
//Every time you take a picture a new dictionary object is created
[imageArray writeToFile:path atomically:YES];
[newEntry release];
}
さて、あなたはたくさんの写真を撮り、画像情報をドキュメント ディレクトリに保存したとしましょう。配列内のすべての画像をロードするなどのことができます。
-(void)loadImages
{
//Load PLIST
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [path objectAtIndex:0];
NSString *plistPath = [NSString stringWithFormat:@"%@/images.plist", documentsDirectory];
//Load PLIST into mutable array
NSMutableArray *imageArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
for (NSDictionary *dict in imageArray) {
//Do whatever you want here, to load an image for example
NSString *imageFilePath = [NSHomeDirectory() stringByAppendingPathComponent:[dict objectForKey:@"Original Image"]];
UIImage *image = [UIImage imageWithContentsOfFile:imageFilePath];
}
}
ロックオン。
Pictue Name をキーとして NSDictionary 内に NSData オブジェクトとして画像を保存できます。アプリがバックグラウンドに移行するたびに、NSDictionary は後で NSUserDefaults オブジェクトに保存され、アプリの初期化時にリロードされます。
AppDelegate.m 内
-(void) applicationDidEnterBackground:(UIApplication*)application
{
NSUserDefaults *infoSaved = [NSUserDefaults standardUserDefaults];
[infoSaved setObject:imagesDictionary forKey:@"imagesFile"];
[infoSaved:synchronize];
}
これにより、デバイスのアプリ フォルダー内のファイルに NSDictionary が保存されます。
カメラから新しい写真を撮った後、新しい画像オブジェクトで imageDictionary を更新します。"
あなたのviewControllerで
-(void) updateImageDictionary {
NSData *imageNSData = UIImagePNGRepresentation(theUIImage);
[imagesDictionary addObject:imageNSData forKey:@"TheImageName"];
}
おそらくアプリの初期化で、画像リストを更新する必要がある場合は、NSUserDefaults のこのオブジェクトからそれらをロードします。
あなたのviewControllerで
-(void) loadImagesDictionary {
imagesDictionary = [infoSaved objectForKey:@"imagesFile"];
}
また、View Controller の imagesDictionary オブジェクトを AppDelegate の imagesDictionary オブジェクトと共有する方法を見つける必要があります。これを行う 1 つの方法は、グローバル変数を使用することです。より簡単な方法は、NSUserDefault オブジェクトを使用することです。