从文档目录填充 UICollectionView 图像并更新自定义 NSMutableArray 对象?
Populate UICollectionView Images From Document Directory AND Update Custom NSMutableArray object?
在我的数据控制器中,我有书籍对象,每个对象都包含这些属性(以及其他属性):
novel.title = @"Book One";
novel.imageArray = [[NSMutableArray alloc] initWithObjects: [UIImage imageNamed: @"book1image1"], nil];
在应用中,用户可以像这样使用 UIImagePickerController 添加图书图片:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(nonnull NSDictionary<NSString *,id> *)info {
[picker dismissViewControllerAnimated:YES completion:nil];
_addedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
_addedImage = [self scaleImage:_addedImage toSize:CGSizeMake(120, 168)];
[_book.imageArray addObject:_addedImage];
NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:_book.imageArrayID];//folder name
NSError *error = nil;
if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
[[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error];
int i = 0;
for(_addedImage in _book.imageArray)
{
_book.bookAddedToArray = YES;
NSString *fileName = [stringPath stringByAppendingFormat:@"/image%i.jpg", i++];//image name
NSData *data = UIImageJPEGRepresentation(_addedImage, 1.0);
[data writeToFile:fileName atomically:YES];
}
[self.collectionView reloadData];
}
这很好用。所有图像都按预期保存在正确的位置。
只要应用程序保持打开状态,就可以在 collectionView 中查看新图像。您可以在应用程序中的任何位置导航、返回并查看集合查看更多内容。当应用程序完全退出然后重新打开时,collectionView 被重置并且只显示在 dataController 中设置的初始图像(无论我到目前为止实现了什么代码。它总是重置)。所有用户生成的图像仍在文档目录中各自的文件夹中,但我似乎无法使用存储的图像更新 cellForItemAtIndexPath: 大概是因为图像未保存到 _book.imageArray。现在我的单元格被默认的图像数组填充,所以,当然,这就是将要显示的内容。如何更新数组并从文档目录中提取以显示用户图像?
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
if(_book.bookAddedToArray)
{
//*** HOW TO UPDATE _BOOK.IMAGEARRAY ????
cell.bookImageView.image = [_book.imageArray objectAtIndex:indexPath.row];
}
else
{
cell.bookImageView.image = [_book.imageArray objectAtIndex:indexPath.row];
}
return cell;
}
我了解到您可以在 nsuserdefaults 中存储目录路径数组并检索它以填充图像数组,但我还没有找到适合我的解决方案。 None 的答案似乎解决了加载到集合视图或表视图中的问题。谁能指出我正确的方向?请?任何人?哈哈。如果您需要查看更多代码,请告诉我。非常感谢所有建议!
最终,该应用程序将需要重写,因为它已经超出了我原始代码的范围,但此时,这就是我正在使用的。我可能最终会使用 CoreData,但我什至在 S.O 上看到过人们在哪里。建议不要将图像存储在 CoreData 中并使用文档目录。那时我仍然处于同样的情况。
是的!我弄明白了,它就像一个魅力。看来我实际上无法更新我的自定义 NSMutableArray。我可以让它读取另一个数组,但实际上无法更改数组本身。 (我指的是 _book.imageArray。)
didFinishPickingMediaWithInfo 中的一切都保持不变。
我不需要向 cellForItemAtIndexPath 添加任何内容。很简单:
if(_book.bookAddedToArray)
{
cell.bookImageView.image = [_book.imageArray objectAtIndex: indexPath.row];
}
我为我的新阵列创建了一个 属性:
@property (nonatomic, strong) NSMutableArray *imagePathArray;
所有的魔法都发生在 ViewDidLoad 中。
- (void)viewDidLoad
{
[super viewDidLoad];
//initialize new array here
_imagePathArray = [[NSMutableArray alloc] init];
if (_book.bookAddedToArray)
{
int i = 0;
//this is the path to the folder.
NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:_book.imageArrayID];
int z;
NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:stringPath error:NULL];
for (z = 0; z < (int)[directoryContent count]; z++)
{
//this is the path to each image file
NSString *fileName = [stringPath stringByAppendingFormat:@"/image%i.jpg", i++];
NSLog(@"imagefile = %@", fileName);
UIImage *fileNameImage = [UIImage imageWithContentsOfFile:fileName];
//add each image to a new array
[_imagePathArray addObject:fileNameImage];
}
//set my array to the new array
_book.imageArray = _imagePathArray;
}
}
我要感谢这个 post 帮助阅读每个文件夹中的图像:
go to link。
//these are all properties in my Data Class.
_book.imageArrayID
_book.bookAddedToArray
_book.imageArray
我希望这对某人有所帮助!
在我的数据控制器中,我有书籍对象,每个对象都包含这些属性(以及其他属性):
novel.title = @"Book One";
novel.imageArray = [[NSMutableArray alloc] initWithObjects: [UIImage imageNamed: @"book1image1"], nil];
在应用中,用户可以像这样使用 UIImagePickerController 添加图书图片:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(nonnull NSDictionary<NSString *,id> *)info {
[picker dismissViewControllerAnimated:YES completion:nil];
_addedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
_addedImage = [self scaleImage:_addedImage toSize:CGSizeMake(120, 168)];
[_book.imageArray addObject:_addedImage];
NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:_book.imageArrayID];//folder name
NSError *error = nil;
if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
[[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error];
int i = 0;
for(_addedImage in _book.imageArray)
{
_book.bookAddedToArray = YES;
NSString *fileName = [stringPath stringByAppendingFormat:@"/image%i.jpg", i++];//image name
NSData *data = UIImageJPEGRepresentation(_addedImage, 1.0);
[data writeToFile:fileName atomically:YES];
}
[self.collectionView reloadData];
}
这很好用。所有图像都按预期保存在正确的位置。
只要应用程序保持打开状态,就可以在 collectionView 中查看新图像。您可以在应用程序中的任何位置导航、返回并查看集合查看更多内容。当应用程序完全退出然后重新打开时,collectionView 被重置并且只显示在 dataController 中设置的初始图像(无论我到目前为止实现了什么代码。它总是重置)。所有用户生成的图像仍在文档目录中各自的文件夹中,但我似乎无法使用存储的图像更新 cellForItemAtIndexPath: 大概是因为图像未保存到 _book.imageArray。现在我的单元格被默认的图像数组填充,所以,当然,这就是将要显示的内容。如何更新数组并从文档目录中提取以显示用户图像?
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
if(_book.bookAddedToArray)
{
//*** HOW TO UPDATE _BOOK.IMAGEARRAY ????
cell.bookImageView.image = [_book.imageArray objectAtIndex:indexPath.row];
}
else
{
cell.bookImageView.image = [_book.imageArray objectAtIndex:indexPath.row];
}
return cell;
}
我了解到您可以在 nsuserdefaults 中存储目录路径数组并检索它以填充图像数组,但我还没有找到适合我的解决方案。 None 的答案似乎解决了加载到集合视图或表视图中的问题。谁能指出我正确的方向?请?任何人?哈哈。如果您需要查看更多代码,请告诉我。非常感谢所有建议!
最终,该应用程序将需要重写,因为它已经超出了我原始代码的范围,但此时,这就是我正在使用的。我可能最终会使用 CoreData,但我什至在 S.O 上看到过人们在哪里。建议不要将图像存储在 CoreData 中并使用文档目录。那时我仍然处于同样的情况。
是的!我弄明白了,它就像一个魅力。看来我实际上无法更新我的自定义 NSMutableArray。我可以让它读取另一个数组,但实际上无法更改数组本身。 (我指的是 _book.imageArray。)
didFinishPickingMediaWithInfo 中的一切都保持不变。
我不需要向 cellForItemAtIndexPath 添加任何内容。很简单:
if(_book.bookAddedToArray)
{
cell.bookImageView.image = [_book.imageArray objectAtIndex: indexPath.row];
}
我为我的新阵列创建了一个 属性:
@property (nonatomic, strong) NSMutableArray *imagePathArray;
所有的魔法都发生在 ViewDidLoad 中。
- (void)viewDidLoad
{
[super viewDidLoad];
//initialize new array here
_imagePathArray = [[NSMutableArray alloc] init];
if (_book.bookAddedToArray)
{
int i = 0;
//this is the path to the folder.
NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:_book.imageArrayID];
int z;
NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:stringPath error:NULL];
for (z = 0; z < (int)[directoryContent count]; z++)
{
//this is the path to each image file
NSString *fileName = [stringPath stringByAppendingFormat:@"/image%i.jpg", i++];
NSLog(@"imagefile = %@", fileName);
UIImage *fileNameImage = [UIImage imageWithContentsOfFile:fileName];
//add each image to a new array
[_imagePathArray addObject:fileNameImage];
}
//set my array to the new array
_book.imageArray = _imagePathArray;
}
}
我要感谢这个 post 帮助阅读每个文件夹中的图像: go to link。
//these are all properties in my Data Class.
_book.imageArrayID
_book.bookAddedToArray
_book.imageArray
我希望这对某人有所帮助!