滚动时如何防止UILabel.textColor在dequeueReusableCell中更改?

时间:2019-01-05 23:50:28

标签: swift uitableview scroll uilabel

我在ViewController中将这段代码命名为PlayViewController

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,但没有解决任何问题。

我没有主意/逻辑,任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您应该在致电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之外将确保颜色始终为黑色。