Как отобразить изображения, которые в фотогалерее были только что выделены?

Цель: пользователь выбирает фотографии из своей фотогалереи> Нажмите "Готово" > "Фотографии отображаются".

Проблема: фотографии не отображаются сразу после "Готово". Они появляются, если я снова открываю сборщик и нажимаю "Отмена".

Это работало нормально (фотография появилась мгновенно), когда я использовал UIImagePickerController, но затем я переключился на ELCImagePickerController для множественного выбора, и он больше не работает.

Догадки

  • CollectionView, который отображает все изображения, не перезагружается? Но я попытался позвонить collectionView.reloadData() после того, как изображения выбраны (по завершению Handler). Это не сработало.

Если полезно, это мое elcImagePickerController функция от моего ViewController.swift

func elcImagePickerController(picker: ELCImagePickerController!, didFinishPickingMediaWithInfo info: [AnyObject]!) {

    println("inside elcImagePickerController")

    self.dismissViewControllerAnimated(true, completion: nil)

    if (info.count == 0) {
        return
    }

    var pickedImages = NSMutableArray()
    for any in info {
        let dict = any as! NSMutableDictionary
        let image = dict.objectForKey(UIImagePickerControllerOriginalImage) as! UIImage
        pickedImages.addObject(image)
    }

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT

    dispatch_async(dispatch_get_global_queue(priority, 0), {


        PHPhotoLibrary.sharedPhotoLibrary().performChanges(
            {

                for img in pickedImages{

                    // Request creating an asset from the image
                    // create multiple creationRequestForAssetFromImage

                    let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(img as! UIImage) // add to main gallery

                    // / Request editing the album
                    let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection, assets: self.photosAsset)

                    // Get a placeholder for the new asset and add it to the album editing request
                    let assetPlaceholder = createAssetRequest.placeholderForCreatedAsset

                    albumChangeRequest.addAssets([assetPlaceholder])

                }


            }, completionHandler: {(success, error) in
                NSLog("Adding Image to Library -> %@", (success ? "Success" : "Error"))
                picker.dismissViewControllerAnimated(true, completion: nil)
            }
        )
    })

1 ответ

Решение

Мне потребовалось некоторое время, чтобы продублировать ваш сценарий и ошибку, но мне удалось, и я нашел решение!

Вы были на правильном пути с вызовом collectionView.reloadData() в completionHandler, но это потребовало немного больше работы.


1)

В моем сценарии тестирования я использовал PHFetchResult называется photosAsset в качестве основного источника для UICollectionView (Я предполагаю, что у вас есть аналогичные настройки).

Вы должны обновить это PHFetchResult Чтобы отразить последние изменения, в моем случае я использовал следующую строку:

self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)

2)

Это правильно, что вы должны перезагрузить представление с collectionView.reloadData(), но код внутри completionHandler не запускается в основном потоке / потоке пользовательского интерфейса. Таким образом, вы должны назвать это следующим образом:

dispatch_async(dispatch_get_main_queue(), {self.collectionView?.reloadData()})

Подводя итог:

В конце концов, ваш completionHandler должно выглядеть примерно так:

completionHandler: {(success, error) in
    NSLog("Adding Image to Library -> %@", (success ? "Success" : "Error"))
    self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)
    dispatch_async(dispatch_get_main_queue(), {self.collectionView?.reloadData()})
    picker.dismissViewControllerAnimated(true, completion: nil)
}
Другие вопросы по тегам