In my swift app I have a UITableView with one static cell and many dynamic cells.
Static cell contains different fields, such as labels, map (taken from MapKit) and a button, that indicates whether user voted up or not.
Now, when user presses the button, I want to change its color, possibly without refreshing anything else.
So far my code looks like this:
var currentUserVote:Int = 0
func tableView(_ tview: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if (indexPath as NSIndexPath).row == 0 {
        let cell = tview.dequeueReusableCell(withIdentifier: "cellStatic") as! VideoDetailsCell
        fetchScore(cell.score)
        let voteUpImage = UIImage(named: "voteUp");
        let tintedVoteUpImage = voteUpImage?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
        cell.voteUpButton.setImage(tintedVoteUpImage, for: UIControlState())
        checkUsersVote() { responseObject in
            if(responseObject == 1) {
                cell.voteUpButton.tintColor = orangeColor
            } else if (responseObject == -1){
                cell.voteUpButton.tintColor = greyColor
            } else {
                cell.voteUpButton.tintColor = greyColor
            } 
            self.currentUserVote = responseObject
        }
        //map handling:
        let regionRadius: CLLocationDistance = 1000
        let initialLocation = CLLocation(latitude: latitude, longitude: longitude)
        centerMapOnLocation(initialLocation, map: cell.mapView, radius: regionRadius)
        //cell.mapView.isScrollEnabled = false
        cell.mapView.delegate = self
        .
        .
        . 
        return cell
        } else {
        //handle dynamic cells
        }
}
So in the method above I'm checking if user voted already and based on that I'm setting different color on the button. I'm also centering the map on a specific point.
Now, since it's a static cell, I connected IBAction outlet to that button:
@IBAction func voteUpButtonAction(_ sender: AnyObject) {
     if(currentUserVote == 1) {
        self.vote(0)
    }else if (currentUserVote == -1){
        self.vote(1)
    } else {
        self.vote(1)
    }
}
and the vote method works as follows:
func vote(_ vote: Int){
    let indexPath = IndexPath(row: 0, section: 0)
    let cell = tview.dequeueReusableCell(withIdentifier: "cellStatic") as! VideoDetailsCell
    switch(vote) {
    case 1:
        cell.voteUpButton.tintColor = orangeColor
    case 0:
        cell.voteUpButton.tintColor = greyColor
    case -1:
        cell.voteUpButton.tintColor = greyColor
    default:
        cell.voteUpButton.tintColor = greyColor
    }
    tview.beginUpdates()
    tview.reloadRows(at: [indexPath], with: .automatic)
    tview.endUpdates()
    currentUserVote = vote
    //sending vote to my backend
}
My problem is, that when user taps the button, he invokes the method vote, then - based on the vote, the button changes color, but immediately after that method cellForRow is called and it changes the color of the button again. Also, it refreshes the map that's inside of it.
What I want to achieve is that when user taps the button, it should immediately change its color and that's it. Map stays untouched and the button is not changed again from cellForRow.
Is there a way of refreshing only that particular button without calling again cellForRow?
