Заполнить изображения UICollectionView из каталога документов и обновить пользовательский объект NSMutableArray? - PullRequest
0 голосов
/ 31 мая 2018

В моем контроллере данных у меня есть объекты книги, и каждый объект содержит следующие свойства (среди прочих):

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 и получить егозаполнить образ массива, но мне еще предстоит найти решение, которое работает для меня.Кажется, что ни один из ответов не относится к загрузке в просмотр коллекции или таблицыМожет кто-то указать мне верное направление?Пожалуйста?Кто-нибудь?Лол.Дайте мне знать, если вам нужно увидеть больше кода.Все предложения очень ценятся!

В конечном итоге приложение необходимо будет переписать, поскольку оно вышло за рамки моего исходного кода, но в настоящее время я работаю с этим.Я, вероятно, в конечном итоге буду использовать CoreData, но я даже видел, где люди на SO рекомендовали не хранить изображения в CoreData и использовать каталог документов.Это все еще оставляет меня в той же ситуации.

1 Ответ

0 голосов
/ 06 июня 2018

Да!Я понял это, и это работает как шарм.Кажется, что я не мог на самом деле обновить свой собственный 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;

}


}

Я могуБлагодарим этот пост за помощь в чтении изображений в каждой папке: перейдите по ссылке .

//these are all properties in my Data Class.
    _book.imageArrayID 
    _book.bookAddedToArray
    _book.imageArray 

Надеюсь, это кому-нибудь поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...