Search code examples
swiftuiimagepickercontroller

UICollectionViewCell not showing images picked from UIImagePickerController


Can somebody please see any errors here that are preventing the cell "photoInTheCellnow" to show UIImage values from image Picker

import UIKit
import Photos
import PhotosUI

class FirstViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var collectionView: UICollectionView!

    var photosInTheCellNow = [UIImage]()
    var imagePicker = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.delegate = self
        collectionView.dataSource = self
        imagePicker.delegate = self
    }

    @IBAction func openLibrary(_ sender: UIBarButtonItem) {

        let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()

        switch photoAuthorizationStatus {
        case .authorized: print("Access is granted by user")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization({ (newStatus) in print("status is \(newStatus)"); if newStatus == PHAuthorizationStatus.authorized { print("success") } })
        case .restricted: print("User do not have access to photo album.")
        case .denied: print("User has denied the permission.")  
        }

        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self


        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

            let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage

            photosInTheCellNow.append(image)
            picker.dismiss(animated: true, completion: nil)
        }


        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            picker.dismiss(animated: true, completion: nil)
        }

        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return photosInTheCellNow.count
        }


        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotosCollectionViewCell", for: indexPath) as! PhotosCollectionViewCell

            return cell
        }

        func register(_ cellClass: PhotosCollectionViewCell, forCellWithReuseIdentifier identifier: String) { }
   }
}

This is the custom cell class

import UIKit

class PhotosCollectionViewCell: UICollectionViewCell {


    @IBOutlet weak var imageView: UIImageView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func prepareForReuse() {
        super.prepareForReuse()
    }
}

Solution

  • As mentioned by @RaziTiwana, you need to assign the image to your collection view cell in cellForItemAt:indexPath.

    cell.imageView.image =  photosInTheCellNow[indexPath.row]
    

    You also need to update the collectionView once you have picked the image. You added the image to your photosInTheCellNow property, but you haven't let the collectionView know the data source changed. You can either reload the entire collectionView by calling collectionView.reloadData() or just insert the last row as shown here.

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
           let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
    
           photosInTheCellNow.append(image)
           let indexPath = IndexPath(item: photosInTheCellNow.count-1, section: 0)
           collectionView.insertItems(at: [indexPath])
           picker.dismiss(animated: true, completion: nil)
        }