我在名为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/