我有一个数组,其中存储了从相机拍摄的图片,但是当应用程序关闭或最小化时,下次启动应用程序时它们都消失了。解决此问题的最佳方法是什么?
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,您需要在保存图像时加载它,然后向其中写入数据。我建议创建一个单独的方法,每次拍照时都会调用该方法。将要发生的事情是: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];
}
}
摇滚吧。
您可以将图像保存为 NSDictionary 中的 NSData 对象,并使用 Pictue Name 作为键,并且每当应用程序进入后台时,NSDictionary 都会保存在 NSUserDefaults 对象中,以便稍后在应用程序初始化时重新加载。
在 AppDelegate.m
-(void) applicationDidEnterBackground:(UIApplication*)application
{
NSUserDefaults *infoSaved = [NSUserDefaults standardUserDefaults];
[infoSaved setObject:imagesDictionary forKey:@"imagesFile"];
[infoSaved:synchronize];
}
这会将您的 NSDictionary 保存在设备上 app 文件夹中的文件中。
从相机拍摄新照片后,使用新的图像对象更新您的 imageDictionary”
在您的视图控制器中
-(void) updateImageDictionary {
NSData *imageNSData = UIImagePNGRepresentation(theUIImage);
[imagesDictionary addObject:imageNSData forKey:@"TheImageName"];
}
当您需要刷新图像列表时,可能在您的应用程序初始化中,从 NSUserDefaults 中的此对象加载它们:
在您的视图控制器中
-(void) loadImagesDictionary {
imagesDictionary = [infoSaved objectForKey:@"imagesFile"];
}
您还需要找到一种方法,将视图控制器中的 imagesDictionary 对象与 AppDelegate 中的 imagesDictionary 对象共享。一种方法是使用全局变量,一种更简单的方法是使用 NSUserDefault 对象。