【问题标题】:Cannot change the variable无法更改变量
【发布时间】:2022-07-19 21:31:27
【问题描述】:

大家好,我正在创建一个自定义文本标签,但我无法从视图控制器更改标签文本,所以我需要帮助。

我的自定义文本标签 swift 文件中有代码:

import UIKit

class LinkLabel: UILabel {
    
    private var labelFirstText: String? = "First Text"
    private var labelSecondText: String? = "Second Text"
    
    var firstLabel: String? {
        didSet {
            self.labelFirstText = firstLabel
        }
    }
    var secondLabel: String? {
        didSet {
            self.labelSecondText = secondLabel
        }
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupLabel()
        self.setNeedsDisplay()
    }
    
    @objc
    private func setupLabel() {
        let firstTextNSA = [NSAttributedString.Key.font:
                                UIFont.systemFont(ofSize: 15, weight: .medium),
                            NSAttributedString.Key.foregroundColor: UIColor.secondaryTextColor]
        let secondTextNSA = [NSAttributedString.Key.font:
                                UIFont.systemFont(ofSize: 15, weight: .medium),
                             NSAttributedString.Key.foregroundColor: UIColor.appPurple]
        let attributedString1 = NSMutableAttributedString(string: labelFirstText ?? "First Label" + " ", attributes: firstTextNSA)
        let attributedString2 = NSMutableAttributedString(string: labelSecondText ?? "Second Label", attributes: secondTextNSA)

        attributedString1.append(attributedString2)
        self.attributedText = attributedString1
    }

}

还有我的视图控制器:

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet private weak var signInLabel: LinkLabel!
    
    // MARK: - Life Cycle
        override func viewDidLoad() {
            super.viewDidLoad()
            signInLabel.firstLabel = "Already have an account?"
            signInLabel.secondLabel = "Sign in now"
        }
}

现在一切正常,但我无法更改标签文本。我编写打印函数来记录发生的事情,看看 didset 何时运行,labelFirstText 是“已经有一个帐户?”但是当 init 函数运行 labelFirstText 时采用默认值。我不明白我该如何解决这个问题。

【问题讨论】:

  • init 是让您初始化LinkLabel 实例的函数,它发生在您更改firstLabelsecondLabel 之前。

标签: ios swift nsattributedstring


【解决方案1】:

在任何值更改后立即添加对 setupLabel() 的调用:

var firstLabel: String? {
    didSet {
        self.labelFirstText = firstLabel
        setupLabel()
    }
}

var secondLabel: String? {
    didSet {
        self.labelSecondText = secondLabel
        setupLabel()
    }
}

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多