Как отобразить изображения, которые в фотогалерее были только что выделены?
Цель: пользователь выбирает фотографии из своей фотогалереи> Нажмите "Готово" > "Фотографии отображаются".
Проблема: фотографии не отображаются сразу после "Готово". Они появляются, если я снова открываю сборщик и нажимаю "Отмена".
Это работало нормально (фотография появилась мгновенно), когда я использовал 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)
}