Как обновить collectionView - PullRequest
0 голосов
/ 16 октября 2018

Моя проблема в том, что когда я сохраняю изображение в библиотеку фотографий, мой collectionView не обновляется. Если я нажимаю на первое изображение, оно открывает недавно сохраненное изображение, но визуально collectionView никогда не обновляется.Я думал, что reloadData () работает таким образом, но я думаю, что это не так.

Когда приложение загружается, пользователь выбирает фотографию из collectionView (библиотеки фотографий iPhone), затем отправляет ее в другой вид, где он редактирует изображение, а затем сохраняет его в библиотеке и возвращается к первому виду, используя раскручивающиеся сегменты..

Мой код:

class pickerViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var activityIndicator:UIActivityIndicatorView = UIActivityIndicatorView()

    var imageArray = [UIImage]()


    override func viewDidLoad() {
        mygtukasMenu.layer.cornerRadius = 10
        mygtukasMenu.clipsToBounds = true
        grabPhotos()
        kolekcija.reloadData()
    }

    @IBOutlet weak var kolekcija: UICollectionView!
    func grabPhotos(){

        let imgManager = PHImageManager.default()

        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = false
        requestOptions.deliveryMode = .opportunistic // Quality of images
        requestOptions.isNetworkAccessAllowed = true

        requestOptions.isSynchronous = true
        requestOptions.progressHandler = {  (progress, error, stop, info) in
            print("progress: \(progress)")
        }

        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]





        if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) {

            if fetchResult.count > 0 {
                for i in 0..<fetchResult.count {

                    imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: {
                        image, error in
                        self.imageArray.append(image!)


                    })
                }
            }
            else {
                print("You got no photos")
                kolekcija.reloadData()
            }
        }
        kolekcija.reloadData() // UPDATED
    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        grabPhotos()
        kolekcija.reloadData() // UPDATED
    }


}

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Решением моей проблемы является удаление всех изображений из imageArray при каждой загрузке представления.Я не знаю, почему это так важно, но, наконец, это работает.И нет необходимости вызывать reloadData () внутри блока requestImage.(в моем случае)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.imageArray.removeAll()
    grabPhotos()
    kolekcija.reloadData()
}
0 голосов
/ 16 октября 2018

вам нужно вызвать reloadData (), когда вы получаете изображение в func grabPhotos () в блоке

imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: {
                    image, error in
                    self.imageArray.append(image!)
                    self.kolekcija.reloadData() <<<<< HERE RELOAD CALL NEED
                })

, когда вы звоните

override func viewDidLoad() {
    mygtukasMenu.layer.cornerRadius = 10
    mygtukasMenu.clipsToBounds = true
    grabPhotos() <<< photos still grabbing at async mode
    kolekcija.reloadData() <<< there is no images grabbed... it still grabbing at async mode when u call reload func here.....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...