简体   繁体   中英

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

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM