S.M_Emamian
S.M_Emamian

Reputation: 17373

uicollectionview not showing cells swift

I got my data from a url as json string. in my codes, titles variable is an array of my url images.

private let reuseIdentifier = "cell_supporters"

class SupportersCollectionViewController: UICollectionViewController {
    var ids             = [String]()
    var titles          = [String]()

    @IBOutlet var collection_supporters: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        collection_supporters.delegate = self

        // Register cell classes
        self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        getSupporters()
    }

    // MARK: UICollectionViewDataSource

//    override func numberOfSections(in collectionView: UICollectionView) -> Int {
//        // #warning Incomplete implementation, return the number of sections
//        return 1
//    }


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items
        return self.titles.count
    }

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

        print("Hello collectionView")

        let url_img = URL(string: self.titles[indexPath.row])!

        print(url_img)
        cell.img_logo.af_setImage(
            withURL: url_img
        )

        return cell
    }

    func getSupporters() {
        RestApiManager.sharedInstance.getSupporters { (json: JSON) in
            if let results = json.array {
                for entry in results {
                    // print(entry["title"])
                    //self.ids.append(entry["id"].string!)
                    self.titles.append(entry["title"].string!)
                }

                print(self.titles.count)

                DispatchQueue.main.async{
                    self.collection_supporters.reloadData()
                }
            }
        }
    }
}

in my code :

print(self.titles.count) // it shows 5

but:

print("Hello collectionView") // not show anything !

Upvotes: 3

Views: 9849

Answers (4)

Nurlan Sofiyev
Nurlan Sofiyev

Reputation: 505

Dont register cell classes. Delete following line from viewDidLoad function :

 self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

Upvotes: 1

halil_g
halil_g

Reputation: 631

If you're using the default UICollectionViewFlowLayout class for the layout you can try implementing the delegate method that returns the size of each item in the collectionView. The UICollectionView doesn't call the cellForItemAt dataSource method at all if it doesn't have the size information or if they're zero.

Try adding this:

extension SupportersCollectionViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 40, height: 40) // Return any non-zero size here
    }
}

Upvotes: 4

omarzl
omarzl

Reputation: 939

Change it to this:

private let reuseIdentifier = "cell_supporters"

class SupportersCollectionViewController: UICollectionViewController {
    var ids             = [String]()
    var titles          = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Register cell classes
        self.collectionView!.register(SupportersCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        getSupporters()
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items
        return self.titles.count
    }

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

        print("Hello collectionView")

        let url_img = URL(string: self.titles[indexPath.row])!

        print(url_img)
        cell.img_logo.af_setImage(
            withURL: url_img
        )

        return cell
    }

    func getSupporters() {
        RestApiManager.sharedInstance.getSupporters { (json: JSON) in
            if let results = json.array {
                for entry in results {
                    // print(entry["title"])
                    //self.ids.append(entry["id"].string!)
                    self.titles.append(entry["title"].string!)
                }

                print(self.titles.count)

                DispatchQueue.main.async{
                    self.collectionView!.reloadData()
                }
            }
        }
    }
}

First, you don't required this:

@IBOutlet var collection_supporters: UICollectionView!

Because your view controller is inherited from UICollectionViewController

Also I changed the register of the UICollectionViewCell class to this so it won't crash when you the cells are created:

self.collectionView!.register(SupportersCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

Upvotes: 0

Stefan Stefanov
Stefan Stefanov

Reputation: 829

Add this line in your ViewDidLoad() method:

self.collectionView!.delegate = self

Upvotes: 0

Related Questions