简体   繁体   中英

Trouble reusing TableViewCells in Swift

I have some trouble reusing cells in swift. I want the code below to only execute for the cells where post.altC.isEmpty actually is true. The problem is that it makes botBtnsStackView.isHidden = true for all cells, even though altC is not empty in all. What am I doing wrong?

The code below is from my PostCell file(just a part of the configureCell code at the bottom, but it's this part that is going wrong):

    if post.altC.isEmpty == true {
        botBtnsStackView.isHidden = true
    } else {
        altCLabel.text = post.altC["text"] as? String
        if let votes = post.altC["votes"]{
            self.altCVotesLbl.text = "\(votes)"
        }
    }

cellForRowAt:

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

    let post = posts[indexpath.row]

    if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexpath) as? PostCell{
        cell.configureCell(post: post)
        return cell
    } else {
        return PostCell()
    }
}

ConfigureCell from PostCell file:

 func configureCell(post: Post) {

    self.post = post


    //ALT A
    if post.altA.isEmpty == false {
        altALabel.text = post.altA["text"] as? String
        if let votes = post.altA["votes"]{
            self.altAVotesLbl.text = "\(votes)"
        }
    } else {
        print("No data found in Alt A")
    }

    //ALT B
    if post.altB.isEmpty == false {
        altBLabel.text = post.altB["text"] as? String
        if let votes = post.altB["votes"]{
            self.altBVotesLbl.text = "\(votes)"
        }
    } else {
        print("No data found in Alt B")
    }
    //ALTD
    if post.altD.isEmpty == false {
        altDLabel.text = post.altD["text"] as? String
        if let votes = post.altD["votes"]{
            self.altDVotesLbl.text = "\(votes)"
        }

    } else {
        altDView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0)
        altDVotesView.isHidden = true
        altDLabelView.isHidden = true
    }

//ALT C
        if post.altC.isEmpty == true {
            print("No data found in Alt C")
            //altCView.isHidden = true
            botBtnsStackView.isHidden = true
        } else {
            altCLabel.text = post.altC["text"] as? String
            if let votes = post.altC["votes"]{
                self.altCVotesLbl.text = "\(votes)"
            }
        }

Cells are reused. So anything you do in an if statement you need to undo in the else .

So your snipped needs to be changed to:

if post.altC.isEmpty == true {
    botBtnsStackView.isHidden = true
} else {
    botBtnsStackView.isHidden = false
    altCLabel.text = post.altC["text"] as? String
    if let votes = post.altC["votes"]{
        self.altCVotesLbl.text = "\(votes)"
    }
}

Your others need to be update as well. For example, for "ALT A":

if post.altA.isEmpty == false {
    altALabel.text = post.altA["text"] as? String
    if let votes = post.altA["votes"]{
        self.altAVotesLbl.text = "\(votes)"
    }
} else {
    altALabel.text = ""
    self.altAVotesLbl.text = ""
    print("No data found in Alt A")
}

I'm guessing a bit here but this gives you an idea. Adjust this to suit your actual needs. The important thing to remember is that whatever you set for one condition, you must reset for other conditions.

Unrelated but you should rewrite your cellForRowAt as:

func tableView(_ tableView: UITableView, cellForRowAt indexpath: IndexPath) -> UITableViewCell {
    let post = posts[indexpath.row]

    let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexpath) as! PostCell

    cell.configureCell(post: post)

    return cell
}

This is a case where a force-cast is appropriate. You want your app to crash early on in development if you have setup your cell identifier and cell type incorrectly. Once setup properly and working, it can't crash at runtime unless you do something to break it.

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