Mi problema es que cuando guardo la imagen en la biblioteca de fotos, mi vista de colección no se actualiza. Si hago clic en la primera imagen, se abre la imagen que guardé recientemente, pero la vista de colección nunca se actualiza visualmente. Pensé que reloadData () funciona de esta manera, pero supongo que no lo es.

Cuando se carga la aplicación, el usuario elige la foto de collectionView (biblioteca de fotos de iPhone), luego la envía a otra vista donde edita la imagen y luego la guarda en la biblioteca y vuelve a la primera vista usando los segmentos de desenrollado.

Mi código:

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
    }


}
0
SwiftyLifestyle 16 oct. 2018 a las 15:38

2 respuestas

La mejor respuesta

La solución a mi problema es eliminar todas las imágenes de imageArray cada vez que cargo la vista. No sé por qué es tan importante, pero finalmente está funcionando. Y no es necesario llamar a reloadData () dentro del bloque requestImage. (en mi caso)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.imageArray.removeAll()
    grabPhotos()
    kolekcija.reloadData()
}
0
SwiftyLifestyle 16 oct. 2018 a las 18:32

Necesita llamar a reloadData () cuando obtiene una imagen en func grabPhotos () en el bloque

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
                })

Cuando llamas

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.....
}
1
AleyRobotics 16 oct. 2018 a las 13:08