我在名为PlayViewController的ViewController中有以下代码:

var words = [String]()

var numberOfRevealedLabels = 1

var indexGA = 0
var indexWA = 0

override func viewDidLoad() {
    super.viewDidLoad()

    playTableView.delegate = self
    playTableView.dataSource = self

    view.isUserInteractionEnabled = true

    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
    swipeRight.direction = .right
    view.addGestureRecognizer(swipeRight)

    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
    swipeLeft.direction = .left
    view.addGestureRecognizer(swipeLeft)

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellIdentifier = "PlayTableViewCell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? PlayTableViewCell else {
        fatalError("The dequeued cell is not an instance of PlayTableViewCell.")
    }

    cell.wordLabel.text = words[indexPath.row]

    var count = 0
    while (count < words.count)
    {
        if (indexPath.row == count) {
            if (count == 0) {
                cell.wordLabel.isHidden = false
            }
            if (indexGA - 1 == count) {
                cell.wordLabel.textColor = UIColor.green
            } else if (indexWA - 1 == count) {
                cell.wordLabel.textColor = UIColor.red
            }
        }
        count += 1
    }

    cell.wordLabel.isHidden = !(indexPath.row <= numberOfRevealedLabels - 1)

    return cell
}

@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {
    if let swipeGesture = gesture as? UISwipeGestureRecognizer {
        switch swipeGesture.direction {

        case UISwipeGestureRecognizer.Direction.right:
            indexGA = numberOfRevealedLabels
            numberOfRevealedLabels += 1
            playTableView.reloadData()

        case UISwipeGestureRecognizer.Direction.left:
            indexWA = numberOfRevealedLabels
            numberOfRevealedLabels += 1
            playTableView.reloadData()

        default:
            break
        }
    }
}


因此,基本上,该应用执行以下操作:


它以黑色提示列表的第一个单词。
向右滑动可将单词的颜色更改为绿色,向左更改为红色。滑动还会提示下一个黑色单词。
numberOfRevealedLabels计算当前显示的单词数,indexGA有助于跟踪该单词的位置以变成绿色,与indexWA相同,以红色表示。


当我向下滚动以阅读下一个单词时(我开始在第十二个单词上滚动),它的提示颜色与上一个单词相同(如果向右滑动则为绿色,向左滑动则为红色)。此外,列表的第一个单词会随机更改其颜色(黑色,绿色或红色)。

我读过these ones之类的线程,我知道这是由于dequeueReusableCell引起的。

我的代码没有else条件。当添加一个以将.textColor设置为黑色时,除最后两个单词外所有单词均变为黑色。

要修复else语句,我可以编写如下代码:

else {
    if (cell.wordLabel.textColor == UIColor.green) {
        cell.wordLabel.textColor = UIColor.green
    } else if (cell.wordLabel.textColor == UIColor.red) {
        cell.wordLabel.textColor = UIColor.red
    } else {
        cell.wordLabel.textColor = UIColor.black
    }
}


不幸的是,它并不能解决我的问题,单元格中的标签以一种怪异的方式不断改变颜色(另外,它在一个不太逻辑的循环中添加了更多的丑陋的LOC)。

我尝试过的最后一件事:在wordLabel.textColor = UIColor.black中设置PlayTableViewCell.swift,但它没有解决任何问题。

我没有想法/逻辑,非常感谢您的帮助!

最佳答案

调用cell.wordLabel.textColor = UIColor.black后,应立即设置cell.wordLabel.text = words[indexPath.row]

所以它应该看起来像这样:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellIdentifier = "PlayTableViewCell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? PlayTableViewCell else {
        fatalError("The dequeued cell is not an instance of PlayTableViewCell.")
    }
    cell.wordLabel.text = words[indexPath.row]
    cell.wordLabel.textColor = UIColor.black //HERE

    var count = 0
    while (count < words.count)
    {
        if (indexPath.row == count) {
            if (count == 0) {
                cell.wordLabel.isHidden = false
            }
            if (indexGA - 1 == count) {
                cell.wordLabel.textColor = UIColor.green
            } else if (indexWA - 1 == count) {
                cell.wordLabel.textColor = UIColor.red
            }
        }
        count += 1
    }

    cell.wordLabel.isHidden = !(indexPath.row <= numberOfRevealedLabels - 1)

    return cell
}


添加else不能解决问题,因为它位于嵌套的if statement中。具有颜色的单元格仍可以重复使用,因为您没有在任何if statements之前设置默认颜色。除非满足条件,否则将其添加到所有if statements之外将确保颜色始终为黑色。

关于swift - 滚动时如何防止UILabel.textColor在dequeueReusableCell中更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54057392/

10-15 15:26