在 Swift 中重用 TableViewCells 时遇到问题



我在 swift 中重用单元格时遇到了一些麻烦。我希望下面的代码只对 post.altC.isEmpty 实际上是真的单元格执行。问题在于它使botBtnsStackView.isHidden = 对于所有单元格,即使altC并非全部为空。我做错了什么?

下面的代码来自我的PostCell文件(只是底部配置Cell代码的一部分,但这是出错的这部分(:

    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()
    }
}

从PostCell文件配置单元格:

 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)"
            }
        }

单元格被重复使用。因此,您在if语句中所做的任何事情都需要在else中撤消。

因此,您的截图需要更改为:

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)"
    }
}

您的其他人也需要更新。例如,对于"备选项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")
}

我在这里猜测了一点,但这给了你一个想法。调整此设置以满足您的实际需求。要记住的重要一点是,无论您为一个条件设置什么,都必须为其他条件重置。

不相关,但您应该将cellForRowAt重写为:

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
}

在这种情况下,强制投射是合适的。如果单元格标识符和单元格类型设置不正确,您希望应用在开发早期崩溃。一旦正确设置并正常工作,除非您执行某些操作来破坏它,否则它不会在运行时崩溃。

最新更新