从plist保存并获取图像

时间:2013-05-18 05:04:47

标签: ios objective-c plist

我正在开发一个应用程序,从数组中获取图像并在ScrollView中垂直显示。

当用户双击特定图像时,我希望根据该图像的标记值将精确图像存储到plist中,并在需要时稍后检索该图像。

我试过这个

//  Store Data into plist.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask,
                                                         YES);
    NSString *path = [NSString stringWithFormat:@"%@/myPlist.plist",
                      [paths objectAtIndex:0]];

    // Place an image in a dictionary that will be stored as a plist

    NSMutableDictionary * dictionary=[[NSMutableDictionary alloc]init];


    [dictionary setObject:ImgView.tag forKey:@"image"];

    NSLog(@"%@",dictionary);

    // Write the dictionary to the filesystem as a plist
    [NSKeyedArchiver archiveRootObject:dictionary toFile:path];

//从NSmutable数组中获取数据将其存储到scrollview。

int m=0;

AppDelegate * delegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];

delegate.front=TRUE;
delegate.back=FALSE;

UIScrollView *scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];

[scrollView setPagingEnabled:YES];

[scrollView setShowsHorizontalScrollIndicator:NO];

FrontsCards=[[NSMutableArray alloc]initWithObjects:@"cloub1.png",@"cloub2.png",@"cloub3.png",@"cloub4.png",@"cloub5.png",@"cloub6.png",@"cloub7.png",@"cloub8.png",@"cloub9.png",@"cloub10.png",@"cloub11.png",@"cloub12.png",@"diamond1.png",@"diamond2.png",@"diamond3.png",@"diamond4.png",@"diamond5.png", nil];




for(m=0; m<[FrontsCards count];m++)
{

    ImgView.alpha=1;

    ImgView.tag=m;

    int randIdx=arc4random()%[FrontsCards count];

    NSString *imageName=[FrontsCards objectAtIndex:randIdx];

    NSString *fullImageName=[NSString stringWithFormat:@"%@",imageName];

    int padding=0;

    CGRect imageViewFrame=CGRectMake(scrollView.frame.size.width*m+padding, scrollView.frame.origin.y, scrollView.frame.size.width-2*padding, scrollView.frame.size.height);

    ImgView=[[UIImageView alloc]initWithFrame:imageViewFrame];

    [ImgView setImage:[UIImage imageNamed:fullImageName]];




    NSLog(@"%d",m);

    // Place an image in a dictionary that will be stored as a plist
    //[dictionary setObject:image forKey:@"image"];

    // Write the dictionary to the filesystem as a plist
    //[NSKeyedArchiver archiveRootObject:dictionary toFile:path];



    [scrollView addSubview:ImgView];


    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapImgView:)];
    doubleTap.numberOfTapsRequired = 2;
    doubleTap.delegate = self;

    [self.ImgView addGestureRecognizer:doubleTap];

    self.ImgView.userInteractionEnabled=YES;

}

CGSize scrollViewSize=CGSizeMake(scrollView.frame.size.width*[FrontsCards count], scrollView.frame.size.height);
[scrollView setContentSize:scrollViewSize];
[self.view addSubview:scrollView];

提前帮助我,谢谢。

3 个答案:

答案 0 :(得分:1)

在.m文件的顶部定义此MACRO定义

#define LIB_DIR_PATH    NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0]

使用此功能将图像保存到带有图像和名称的Plist

- (void)saveImage:(UIImage *)image WithName:(NSString *)imageName
{
    // If File Exist then read it otherwise creat new
    NSMutableDictionary *imageInfoDict;
    if([[NSFileManager defaultManager] fileExistsAtPath:[LIB_DIR_PATH stringByAppendingPathComponent:@"imageInfo.plist"]])
    {
        NSData *fileData = [NSData dataWithContentsOfFile:[LIB_DIR_PATH stringByAppendingPathComponent:@"imageInfo.plist"]];
        imageInfoDict = [NSMutableDictionary dictionaryWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithData:fileData]];
    }
    else
        imageInfoDict = [NSMutableDictionary dictionaryWithCapacity:0];

    // Add Single Image to Dictionary
    [imageInfoDict setValue:image forKey:imageName];

    // Convert Main info Dictionary to `NSData` to Save on Disc
    [NSKeyedArchiver archiveRootObject:imageInfoDict toFile:[LIB_DIR_PATH stringByAppendingPathComponent:@"imageInfo.plist"]];

    // To Read Stored Image Use Following Code
    [self readImageFromPlistByKey:imageName];
}

此函数返回Plist中各个名称的图像

-(UIImage *)readImageFromPlistByKey:(NSString *)keyName
{
    // If File Exist then read it otherwise creat new
    NSMutableDictionary *imageInfoDict;
    if([[NSFileManager defaultManager] fileExistsAtPath:[LIB_DIR_PATH stringByAppendingPathComponent:@"imageInfo.plist"]])
    {
        NSData *fileData = [NSData dataWithContentsOfFile:[LIB_DIR_PATH stringByAppendingPathComponent:@"imageInfo.plist"]];
        if([fileData length] > 0)
        {
            // Read Plist
            imageInfoDict = [NSMutableDictionary dictionaryWithDictionary:[NSKeyedUnarchiver unarchiveObjectWithData:fileData]];

            // Here is your Image
            return imageInfoDict[keyName];
        }
    }
    else
    {
        // Return Default Image if not Found
        return [UIImage imageNamed:@"Default.png"];
    }
}

答案 1 :(得分:1)

如果您只想存储索引,则需要拥有一个master imageArray。当用户双击两次imageView时,我添加了插入/删除。

- (void)doubleTapImgView:(UITapGestureRecognizer *)recognizer
{
    UIImageView *imageView = (UIImageView *)recognizer.view;
    [self insertorDeleteImageIndex:imageView.tag-1];

}

- (NSString *)plistFilePath{
    NSString *documents =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    return [documents stringByAppendingPathComponent:@"ImageIndexes.plist"];
}

- (void)insertorDeleteImageIndex:(NSInteger)index{

    NSString *filePath = [self plistFilePath];
    NSMutableArray *savedIndexes = [NSMutableArray arrayWithContentsOfFile:filePath];
    if (!savedIndexes) {
        savedIndexes = [NSMutableArray array];
    }

    if (![savedIndexes containsObject:@(index)]) {
        [savedIndexes addObject:@(index)];
    }else{
        [savedIndexes removeObject:@(index)];
    }

    [savedIndexes writeToFile:filePath atomically:YES];

}

- (NSArray *)savedImageIndexes{
    NSString *filePath = [self plistFilePath];
    return [NSArray arrayWithContentsOfFile:filePath];
}

Source code

答案 2 :(得分:0)

您上面发布的代码不能是真正的代码,因为它不会编译。也就是说,它显示了一些错误:

  1. 您不能将基本数字(NSInteger)放入字典中,需要将其加在NSNumber中。
  2. 您在创建图像视图的实例之前设置了图像的标记(因此,它将不执行任何操作或设置错误的标记)。
  3. 要保存图像,如果您确实要保存图像而不是标记,则需要将其另存为数据。您可以将图像存储在字典中没有问题,但如果您希望将字典存储为plist,则需要将图像转换为NSData。您可以使用以下方式获取图像数据:

    UIImageJPEGRepresentation(imageToSave, 0.8)