从文档文件夹加载集合视图中的图像

Posted

技术标签:

【中文标题】从文档文件夹加载集合视图中的图像【英文标题】:Loading images in collection view from documents folder 【发布时间】:2014-02-15 16:38:28 【问题描述】:

我的资源文件夹中有一个图像列表,我想将其加载到集合视图中

我在文档目录中的NSAarray 中有我的图像文件名。

.h


NSArray *fileList;
NSString * searchedImage;

.m

    NSFileManager *filesm = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSArray *getFilelist= [filesm contentsOfDirectoryAtPath:[paths objectAtIndex:0] error:nil];
    BOOL isDirectory;
    for (searchedImage in getFilelist)
        BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:searchedImage isDirectory:&isDirectory];
        if (fileExistsAtPath) 
            if (isDirectory)
            
                //Found Directory
            
        
        if ([[searchedImage pathExtension] isEqualToString:@"png"]) 

            //This is Image File with .png Extension
            NSLog(@"directoryContents = %@",searchedImage);


        
    


    //count files
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *pathsAmount = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    fileList= [fm contentsOfDirectoryAtPath:[pathsAmount objectAtIndex:0] error:nil];
    int filesCount = [fileList count];
    NSLog(@"filesCount:%d", filesCount);


    UINib *cellNib = [UINib nibWithNibName:@"NibCell" bundle:nil];
    [self.appliancesCollectionView registerNib:cellNib forCellWithReuseIdentifier:@"cvCell"];


  
return self;

这会在viewDidLoad 中正确地将我的图像名称重新命名为63293446.pngappliance63293447.pngappliance63293448.pngappliance63293449.png

我想将这些加载到我的收藏视图单元格中。目前它在-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 方法中为我的图像文件名返回一个空值

除了在这里研究之外,我到目前为止所做的尝试

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
    return 1;


-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
    return fileList.count;


-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath     
    static NSString *cellIdentifier = @"cvCell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    cell.backgroundView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: [NSString stringWithFormat:@"%@",searchedImage]]];
    NSLog(@"cell Bg image %@",searchedImage); <-----------------//returns null
    return cell;

【问题讨论】:

这令人困惑。你说你的数组是'searchedImage',然后你用它作为一个字符串来创建图像。你说你得到了有效的名字(我假设'searchedImage'包含文件名)然后你说它返回null。你能澄清一点吗? 什么是searchedImage?你是说你的日志里有cell Bg image null吗? 如果您显示填充 searchedImage 的代码及其定义方式,将会有所帮助。 请将您的代码粘贴到您正在初始化 fileList 和 searchedImage 的位置。 代码已更新,@Akshat 是的 【参考方案1】:

试试这个代码

cell.backgroundView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: [NSString stringWithFormat:@"%@",[fileList objectAtIndex:indexPath.row]]]];

确保 searchedImage 不为零。

【讨论】:

感谢回答,searchedImage 不是 nil,在 viewDidLoad 中返回正确,在 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 中仍然返回 nil【参考方案2】:

图像的文件名在你的fileList数组中,而不是searchedImage,(最后一个变量在创建图像时没有用)。

NSString *fileName = [fileList objectAtIndex:indexPath.row];
cell.backgroundView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: fileName]];

这里的问题是,在你的代码中,fileList 可以包含不是图像的文件,因此imageNamed: 将失败,并返回 nil。你应该过滤你的 fileList 数组,并确保它只包含图像。

【讨论】:

我不明白的是为什么它在 `if ([[item pathExtension] isEqualToString:@"png"])` 被过滤,正如你所说的,当我想要包含来自 documnets 目录的所有文件时在-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 中使用它 您的数组未过滤。当您使用NSArray *getFilelist= [filesm contentsOfDirectoryAtPath:[paths objectAtIndex:0] error:nil]; 时,您拥有所有文件(可能包括非图像)。 if ([[item pathExtension] isEqualToString:@"png"]) 行对您的代码没有任何影响。 它在 `if ([[item pathExtension] isEqualToString:@"png"])` 被过滤,因为我的日志只根据需要返回 png 文件。 @JSA986 你错了......你只是在打印 png 文件!您的代码说“如果它是 png 文件,则将其打印在日志上”...但是该数组可以包含其他文件!!!【参考方案3】:

首先通过NSMutableArray *fileList; 使文件列表可变 块中的下一步将图像路径添加到文件列表

  if ([[searchedImage pathExtension] isEqualToString:@"png"]) 

       //This is Image File with .png Extension
        NSLog(@"directoryContents = %@",searchedImage);
        [fileList addObject:searchedImage]
   

然后在cellForItemAtIndexPath:

设置图片
cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[fileList objectAtIndex:indexPath.row]]];

【讨论】:

以上是关于从文档文件夹加载集合视图中的图像的主要内容,如果未能解决你的问题,请参考以下文章

从文档目录获取图像到集合视图

在加载视图之前从 iCloud 加载文档

从网络加载图像并将其显示在集合视图中

应用程序的 Documents 文件夹中的图像需要延迟表图像加载

无法将本地存储的图像更快地加载到集合视图中。?

无法使用 JavaScript 文件中文档目录中的图像