Swift UILabel子视图未更新

时间:2018-01-27 16:48:55

标签: ios swift

我有一个UICollectionView的标题。此标头包含UILabel。我通过委托调用函数updateClue来更新标签的文本值。

class LetterTileHeader: UICollectionViewCell {
  override init(frame: CGRect) {
    super.init(frame: frame)
    setupViews()
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  var clueLabel: UILabel = {
    let label = UILabel()
    label.font = UIFont.systemFont(ofSize: 16)
    label.text = "HELLO"
    label.textColor = UIColor.white
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
  }()

  func setupViews() {
    backgroundColor = GlobalConstants.colorDarkBlue
    addSubview(clueLabel)

    clueLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    clueLabel.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
    clueLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
    clueLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
  }

  func updateClue(clue: String) {
    clueLabel.text = clue
    debugLabel()
  }

  func debugLabel() {
    print(clueLabel.text)
  }

函数debugLabel正在使用来自updateClue的已更改文本进行打印。但屏幕上的标签不会更新。我错过了什么?我已经尝试使用DispatchQueue.main.async块来更改其中的标签文本,但仍然没有变化。

UpdateClue函数通过协议委派从另一个类触发。

extension PuzzleViewController: WordTileDelegate {
  func relaySelectedWordId(wordId: String!) {
    selectableTiles.updateTileHeaderClue(wordId: wordId)
  }
}

感谢。

更新: 我已经弄清楚发生了什么。每次选择新单元格时都会创建此子视图。调查为什么会发生这种情况。将很快更新。

我遇到的问题是由于此细胞类被多次初始化。我相信我看到的标签不是当前正在更新的标签,而是之前实例化的标签。我有一个新问题,但如果我无法解决这个问题,我可能会提出一个问题。

2 个答案:

答案 0 :(得分:0)

你有两个UILabel和/或两个LetterTileHeaders。您正在更新的是而不是屏幕上显示的那个。

证明这一点的一种方法是在let label = UILabel()之后的行上设置断点。断点很可能不止一次被击中。

另一种方法是查看调试器中的屏幕布局并找到显示的UILabel的内存位置,然后在updateClue方法中放置一个断点,并将该标签的内存位置与正在屏幕上显示。

答案 1 :(得分:0)

关注代码似乎是错误的,这意味着每次使用clueLble时它都会给你新鲜的UILable实例。

var clueLabel: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 16)
label.text = "HELLO"
label.textColor = UIColor.white
label.translatesAutoresizingMaskIntoConstraints = false
return label

}()

尝试这样做:

  1. 只需将上面的代码替换为 var clueLabel = UILabel()

  2. 添加以下功能:

    override func awakeFromNib() {
    super.awakeFromNib()
    label.font = UIFont.systemFont(ofSize: 16)
    label.text = "HELLO"
    label.textColor = UIColor.white
    label.translatesAutoresizingMaskIntoConstraints = false
    
    backgroundColor = GlobalConstants.colorDarkBlue
    addSubview(clueLabel)
    
    clueLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    clueLabel.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
    clueLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
    clueLabel.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
    

    }

  3. 删除setupViews()