我有一个存储在其中的图片的数组,这些图片是从相机中取出的,但是当应用程序关闭或最小化时,下次应用程序启动时它们都会消失。解决这个问题的最佳方法是什么?
答案 0 :(得分:6)
不是将图像添加到数组中,而是将图像保存到应用文档文件夹中,而不是像这样:
//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];
}
}
摇滚。
答案 1 :(得分:2)
您可以将图像作为NSData对象保存在NSDictionary中,并将Pictue Name作为键,每当应用程序进入后台时,NSDictionary将保存在NSUserDefaults对象中,稍后将在app init上重新加载。
在AppDelegate.m中
-(void) applicationDidEnterBackground:(UIApplication*)application
{
NSUserDefaults *infoSaved = [NSUserDefaults standardUserDefaults];
[infoSaved setObject:imagesDictionary forKey:@"imagesFile"];
[infoSaved:synchronize];
}
这会将您的NSDictionary保存在设备上app文件夹中的文件中。
从相机拍摄新照片后,使用新的图像对象“
更新imageDictionary 在viewController中
-(void) updateImageDictionary {
NSData *imageNSData = UIImagePNGRepresentation(theUIImage);
[imagesDictionary addObject:imageNSData forKey:@"TheImageName"];
}
当您需要刷新图像列表时,可能在您的app init中,从NSUserDefaults中的此对象加载它们:
在viewController中
-(void) loadImagesDictionary {
imagesDictionary = [infoSaved objectForKey:@"imagesFile"];
}
您还需要找到一种方法,使用AppDelegate中的imagesDictionary对象在视图控制器中共享imagesDictionary对象。 一种方法是使用全局变量,更简单的方法是使用NSUserDefault对象。