从文档文件夹加载集合视图中的图像
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.png
、appliance63293447.png
、appliance63293448.png
、appliance63293449.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]]];
【讨论】:
以上是关于从文档文件夹加载集合视图中的图像的主要内容,如果未能解决你的问题,请参考以下文章