从文档目录填充 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 

我希望这对某人有所帮助!