0

我正在开发一个从数组中获取图像并在 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 数组中获取数据,将其存储到滚动视图中。

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];

提前帮我解决这个问题。

4

3 回答 3

1

如果您只想存储索引,则需要有一个主 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];
}

源代码

于 2013-05-18T07:03:08.067 回答
1

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

#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"];
    }
}
于 2013-05-18T06:55:11.773 回答
0

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

  1. 您不能将基本数字 ( NSInteger) 放入字典中,它需要装在NSNumber.
  2. 您在创建图像视图的实例之前设置图像的标签(因此它不会执行任何操作或设置错误的标签)。

为了保存图像,如果您确实想保存图像而不是标签,则需要将其保存为数据。您可以将图像存储在字典中没问题,但是如果您想将字典存储为 plist,则需要将图像转换为NSData. 您可以使用以下方法获取图像数据:

UIImageJPEGRepresentation(imageToSave, 0.8)
于 2013-05-18T07:02:14.493 回答