[Solved] How can I parse each items into it’s on uicollection view cell

Introduction

Parsing items into individual UICollectionView cells can be a great way to organize and display data in an efficient and visually appealing way. This tutorial will provide step-by-step instructions on how to parse items into individual UICollectionView cells. We will cover topics such as setting up the UICollectionView, creating custom cells, and populating the cells with data. By the end of this tutorial, you will have a better understanding of how to parse items into individual UICollectionView cells.

Solution

You can parse each item into its own UICollectionViewCell by using the UICollectionViewDataSource methods. Specifically, you can use the cellForItemAtIndexPath method to create a UICollectionViewCell for each item in your data source. In this method, you can create a UICollectionViewCell for each item and configure it with the data from the item.

For example, if you have an array of strings, you can create a UICollectionViewCell for each string and set the cell’s label to the string.

You can also use the numberOfItemsInSection method to determine how many items you need to create UICollectionViewCells for.

Finally, you can use the didSelectItemAtIndexPath method to handle user interactions with the UICollectionViewCells.


Please check :

OsuHomeController

let cellId = "cellId"

struct AnimeJsonStuff: Decodable {
    let data: [AnimeDataArray]
}

struct AnimeLinks: Codable {
    var selfStr   : String?

    private enum CodingKeys : String, CodingKey {
        case selfStr     = "self"
    }
}
struct AnimeAttributes: Codable {
    var createdAt   : String?
    var slug : String?
    let synopsis: String?

    private enum CodingKeys : String, CodingKey {
        case createdAt     = "createdAt"
        case slug = "slug"
        case synopsis = "synopsis"

    }
}

struct AnimeRelationships: Codable {
    var links   : AnimeRelationshipsLinks?

    private enum CodingKeys : String, CodingKey {
        case links     = "links"
    }
}

struct AnimeRelationshipsLinks: Codable {
    var selfStr   : String?
    var related   : String?

    private enum CodingKeys : String, CodingKey {
        case selfStr     = "self"
        case related     = "related"
    }
}

struct AnimeDataArray: Codable {
    let id: String?
    let type: String?
    let links: AnimeLinks?
    let attributes: AnimeAttributes?
    let relationships: [String: AnimeRelationships]?


    private enum CodingKeys: String, CodingKey {
        case id = "id"
        case type = "type"
        case links = "links"
        case attributes = "attributes"
        case relationships = "relationships"

    }
}

class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {


    var isDataLoaded = false
    var animeNames: [String] = []
    var animeSynopsis: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

            self.jsonDecoding()
        // Do any additional setup after loading the view, typically from a nib.

        navigationItem.title = "Kitsu - Your anime feed"

        collectionView?.backgroundColor = UIColor(red:0.09, green:0.13, blue:0.19, alpha:1.0)
        collectionView?.register(viewControllerCells.self, forCellWithReuseIdentifier: cellId)

        collectionView?.delegate = self
    }


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

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! viewControllerCells
        cell.nameLabel.text = animeNames[indexPath.row]
        cell.synopsis.text = animeSynopsis[indexPath.row]
        return cell
    }

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

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return  UIEdgeInsets(top: 15, left: 0, bottom: 10, right: 0)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func jsonDecoding() {
        let jsonUrlString = "https://kitsu.io/api/edge/anime"

        guard let url = URL(string: jsonUrlString) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}
            do {
                let animeJsonStuff =  try JSONDecoder().decode(AnimeJsonStuff.self, from: data)
                for anime in animeJsonStuff.data {
                    //   print(anime.id)
                    //    print(anime.type)
                    //   print(anime.links?.selfStr)
                    if let animeName = anime.attributes?.slug {
                        self.animeNames.append(animeName)
                    } else {
                        self.animeNames.append("-")
                    }
                    if let animeSynop = anime.attributes?.synopsis {
                        self.animeSynopsis.append(animeSynop)
                    } else {
                        self.animeSynopsis.append("-")
                    }

                    for (key, value) in anime.relationships! {
                        //   print(key)
                        //   print(value.links?.selfStr)
                        //    print(value.links?.related)
                    }
                }
                self.isDataLoaded = true
                DispatchQueue.main.async {
                    self.collectionView?.reloadData()
                }
            } catch let jsonErr {
                print("Error serializing json", jsonErr)
            }
        }.resume()
    }   
}

viewControllerCells

class viewControllerCells: UICollectionViewCell {

    let nameLabel: UILabel = {
        let label = UILabel()
        label.textColor = UIColor.black

        return label
    }()
    let profileImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFit
        return imageView
    }()

    let synopsis: UILabel = {
        let label = UILabel()
        label.textColor = UIColor.black

        return label
    }()


    override init(frame: CGRect) {
        super.init(frame: frame)
        setupViews()
        self.layer.shadowOpacity = 0.05
        self.layer.shadowRadius = 0.05
        self.layer.cornerRadius = 1



    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setupViews() {
        backgroundColor = UIColor(red:0.86, green:0.87, blue:0.89, alpha:1.0)
        addSubview(nameLabel.self)
        addSubview(synopsis.self)
        addConstraintsWithFormat("H:|-18-[v0]|", views: synopsis)
        addConstraintsWithFormat("V:|-8-[v0]|", views: synopsis)
        addConstraintsWithFormat("H:|-12-[v0]|", views: nameLabel)
    }
}

extension UIColor {

    static func rgb(_ red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor {
        return UIColor(red: red/255, green: green/255, blue: blue/255, alpha: 1)
    }

}

extension UIView {

    func addConstraintsWithFormat(_ format: String, views: UIView...) {
        var viewsDictionary = [String: UIView]()
        for (index, view) in views.enumerated() {
            let key = "v\(index)"
            viewsDictionary[key] = view
            view.translatesAutoresizingMaskIntoConstraints = false
        }

        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary))
    }
}

solved How can I parse each items into it’s on uicollection view cell


If you want to parse each item into its own UICollectionViewCell, you will need to create a custom UICollectionViewCell subclass. This subclass should contain the properties and methods necessary to parse the item into the cell. You can then use the UICollectionViewDataSource methods to populate the cells with the items.

To create the custom UICollectionViewCell subclass, you will need to create a new class in your project. This class should inherit from UICollectionViewCell and should contain the properties and methods necessary to parse the item into the cell. For example, you may need to create a method to parse the item into the cell’s UI elements, such as labels, images, and buttons.

Once you have created the custom UICollectionViewCell subclass, you can use the UICollectionViewDataSource methods to populate the cells with the items. The UICollectionViewDataSource methods provide the necessary information to populate the cells with the items. For example, the cellForItemAtIndexPath: method provides the necessary information to create the cell and populate it with the item.

Once you have populated the cells with the items, you can use the UICollectionViewDelegate methods to handle user interactions with the cells. For example, the didSelectItemAtIndexPath: method provides the necessary information to handle user interactions with the cell.

By creating a custom UICollectionViewCell subclass and using the UICollectionViewDataSource and UICollectionViewDelegate methods, you can parse each item into its own UICollectionViewCell. This will allow you to create a more customized and interactive user experience.