user1591668
user1591668

Reputation: 2893

IOS TableView how can I update an element in my TableView

I am using Swift 4 and I finally got my TableView cell working correctly . I have a like button and when a user clicks it I update only the cell that was clicked and show a new image either like or unliked, in addition I show a LikeCounter +1 for like and -1 for unlike .That's all working.

My question is how can I make it so that I only update those 2 elements on button clicked ?

right now it updates the Table View Cell . This is my code

  @IBAction func voteAction(_ sender: UIButton)
    {
       if let indexPathm = TableView.indexPathForView(sender) {
            if streamsModel.VoteStatus[sender.tag] == "0"   {
                streamsModel.VoteStatus[sender.tag] = "1"
                streamsModel.Votes[sender.tag] = streamsModel.Votes[sender.tag] + 1
            } else {
                streamsModel.VoteStatus[sender.tag] = "0"
                streamsModel.Votes[sender.tag] = streamsModel.Votes[sender.tag] - 1
            }
            TableView.reloadRows(at: [indexPathm],with: .none)

        }

     }

Once you click that button then it goes here

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

 let cell = tableView.dequeueReusableCell(withIdentifier: "HomeTVC", for: indexPath) as! HomeTVC

    cell.vote_status = streamsModel.VoteStatus[indexPath.row]

            if streamsModel.VoteStatus[indexPath.row] != "0" {
                cell.voteImage.setImage(UIImage(named: "liked"), for:  .normal)
            } else {
                cell.voteImage.setImage(UIImage(named: "unliked"), for:  .normal) }

}

I have a lot more cell elements in that TableViewCell however I would only like to update and isolate that specific piece of code in my TableViewCell .

I have tried doing it using this method Update label in custom UITableView Cell however I find that if I scroll down and then back up it reverts whatever changes I did .

  // This works however if you scroll down then back up
  // it reverts back to the original status
 let button = sender as! UIButton
    let view = button.superview!
    let cell = view.superview as! HomeTVC

    let indexPath = tableView.indexPathForCell(cell)
    println(indexPath)
    if(indexPath != nil){
          if streamsModel.VoteStatus[indexPath.row] != "0" {
            cell.voteImage.setImage(UIImage(named: "liked"), for:  .normal)
        } else {
            cell.voteImage.setImage(UIImage(named: "unliked"), for:  .normal) }

 }
    }

So now I'm calling but it's updating the whole cell .

TableView.reloadRows(at: [indexPathm],with: .none)

Upvotes: 0

Views: 419

Answers (1)

LorenzOliveto
LorenzOliveto

Reputation: 7936

You can retrieve the cell and update only the properties of the cell directly like this:

if let cell = tableView.cellForRow(at: indexPath) as? HomeTVC {
    // Update the cell
}

EDIT: I missed the second part of the question, sorry. I think that the problem here is that you're not updating your model, so when you scroll up the delegate calls tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) and sets the value as saved previously on the model. You have to update the value of streamsModel.VoteStatus when the button is pressed.

Upvotes: 1

Related Questions