Cant display image in UICollectionView cell

169 views Asked by At

I need to display images in collection view cells but when I'm trying to do that I'm getting 10 empty cells and I don't know where im making mistakes

Here is my code of ViewController

class NewGalleryViewController: UIViewController {
var presenter: ViewToPresenterPhotoProtocol?
var builder: GalleryRequestBuilder?

@IBOutlet var collectionView: UICollectionView!

let reuseIdentifier = "customCVCell"


@objc func refresh() {
    presenter?.refresh()
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.setupPresenterIfNeed()
    presenter?.viewDidLoad()
    // Do any additional setup after loading the view.
}

func setupPresenterIfNeed() {
    self.collectionView.backgroundColor = UIColor.white
    if self.presenter == nil {
        let presenter = GalleryPresenter()
        presenter.view = self
        self.presenter = presenter
        self.builder = GalleryRequestBuilder()
    }
}
}

     extension NewGalleryViewController: UICollectionViewDelegate,  UICollectionViewDataSource,                                 UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.presenter?.photos.count ?? 0
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! PhotoCollectionViewCell
    
    KFImage.url(builder?.createImageUrl(name: (presenter?.photos[indexPath.item].name)!))
        .onSuccess { result in
            cell.imageView.image = result.image
        }
    
    return cell
}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 180, height: 128)
}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

func collectionView(_ collectionView: UICollectionView, layout
                        collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 20.0
}
// MARK: - UICollectionViewDelegate protocol

private func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    // handle tap events
    print("You selected cell #\(indexPath.item)!")
}
}

extension NewGalleryViewController: PresenterToViewPhotoProtocol{
func onFetchPhotoSuccess() {
    self.collectionView.reloadData()
    self.collectionView!.collectionViewLayout.invalidateLayout()
    self.collectionView!.layoutSubviews()
    self.collectionView.refreshControl?.endRefreshing()
}

func onFetchPhotoFailure(error: String) {
    print("View receives the response from Presenter with error: \(error)")
    self.collectionView.refreshControl?.endRefreshing()
}


}

And Here is the code of cell

class PhotoCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var imageView: UIImageView!

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

}

I've checked the link I'm making request to and it works. So problem is not in link. Maybe I should reload items after getting images?

1

There are 1 answers

0
lpizzinidev On

You should set your UICollectionView delegate and data source once the view is loaded:

override func viewDidLoad() {
    super.viewDidLoad()

    // Add this lines
    collectionView.delegate = self
    collectionView.dataSource = self

    self.setupPresenterIfNeed()
    presenter?.viewDidLoad()
}