Search code examples
iosswiftuitableviewuicollectionviewcell

Button inside the CollectionView repeating the first cell information


i am creating images app from my Wordpress website's json using swift , i have created CollectionView and every cell displaying images and working fine but i want to add show comment in every cell for each post, its showing the exact comments for every post/cell but when i click on it it shows the comments of very first post of collection view. this is my code to show comments and for clickable button.

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

    let url = dataArray[indexPath.row]["thumbnail_images"]["medium"]["url"].stringValue
    cell.imageArticle.sd_setImage(with: NSURL(string: url) as URL?, placeholderImage:UIImage(named: "empty.png"))
     cell.nametag.text = String(htmlEncodedString:dataArray[indexPath.row]["tags"][0]["title"].stringValue)
    cell.nametagg.text =  String(htmlEncodedString:dataArray[indexPath.row]["categories"][0]["title"].stringValue)



    cell.fbButton.addTarget(self, action: #selector(homeController.fbClick), for: .touchUpInside)

    cell.commentButton.addTarget(self, action: #selector(homeController.comment), for: .touchUpInside)
    cell.commentButton.setTitle("\(dataArray[indexPath.row]["comment_count"].stringValue) comments", for: .normal)
    cell.leaveComment.addTarget(self, action: #selector(homeController.leavecomment), for: .touchUpInside)




   cell.contentline.text = String(htmlEncodedString:dataArray[indexPath.row]["excerpt"].stringValue)





 return cell
}

and this is the code for button click

@objc func comment(_ sender: Any) {

  let vc = CommentViewController()
    vc.dataArray = dataArray[indexPath.row]["comments"].array
    self.navigationController!.pushViewController(vc, animated: true)


}

i hope you understand my question, thanks


Solution

  • You've declared the indexPath as a global variable and it's value is NSIndexPath(row: 0, section: 0) as you said.

    in comments(_:) function you've used indexPath.row but this row is 0 so it is first post's comments.

    You don't need to set tapgesture to cell's button.


    In homeViewCell you should create IBAction for the button and call closure when it triggered ->

    class homeViewCell: UICollectionViewCell {
    
        public var didTapComment: (() -> Void)?
    
        @IBAction func didTapCommentButton(_ sender: UIButton) {
            didTapComment?()
        }
    }
    

    Set didTapComment's action in cellForItemAt like this ->

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! homeViewCell
    
        cell.didTapComment = { [weak self] in
            let vc = CommentViewController()
            vc.dataArray = dataArray[indexPath.row]["comments"].array
            self?.navigationController!.pushViewController(vc, animated: true)
        }
    
        let url = dataArray[indexPath.row]["thumbnail_images"]["medium"]["url"].stringValue
    
        cell.imageArticle.sd_setImage(with: NSURL(string: url) as URL?, placeholderImage:UIImage(named: "empty.png"))
        cell.nametag.text = String(htmlEncodedString:dataArray[indexPath.row]["tags"][0]["title"].stringValue)
        cell.nametagg.text =  String(htmlEncodedString:dataArray[indexPath.row]["categories"][0]["title"].stringValue)
    
        cell.fbButton.addTarget(self, action: #selector(homeController.fbClick), for: .touchUpInside)
    
        cell.commentButton.setTitle("\(dataArray[indexPath.row]["comment_count"].stringValue) comments", for: .normal)
        cell.leaveComment.addTarget(self, action: #selector(homeController.leavecomment), for: .touchUpInside)
    
        cell.contentline.text = String(htmlEncodedString:dataArray[indexPath.row]["excerpt"].stringValue)
    
        return cell
     }
    }
    

    Remove followings;

    • cell.commentButton.addTarget(self, action: #selector(homeController.comment), for: .touchUpInside) line from cellForItemAt

    • @objc func comment(_ sender: Any) function

    • let indexPath = NSIndexPath(row: 0, section: 0)