如何大写来自 Swift 子类的 UILabel 的文本属性

Posted

技术标签:

【中文标题】如何大写来自 Swift 子类的 UILabel 的文本属性【英文标题】:How to uppercase the text property of UILabel from Swift subclass 【发布时间】:2018-05-03 12:09:34 【问题描述】:

我在我的应用程序中为UILabel 创建了一个 Swift 子类来管理它在所有视图中的样式,以便以后修改样式更容易。我知道要将字符串转换为大写,我可以使用uppercased() 来实现。

但是,当我在 UILabel 文本属性的子类中使用 uppercased()capitalized 时,问题就出在运行时。奇怪的是它在情节提要上正确呈现(使用@IBDesignable),但在运行时,它显示了未大写的字符串。

比如我在UILabel子类中有一个类似这样的代码:

textColor = ...
font = UIFont(name: "Avenir-Medium", size: 12.0)
text = text!.uppercased()

然后在视图控制器中,我有类似这样的代码:

label_noWeightMessage.text = "No weight logs this week..."

颜色和字体应用正确,但大小写更改除外。我在这里遗漏了什么吗?

在故事板中,文本显示为“本周没有体重记录...” 但在模拟器运行时,它会恢复到原来的情况。

我知道我可以只用大写字母输入文本。但这不是我想要的。我希望能够在所有屏幕上重复使用样式,而无需重新输入所有 UILabel 文本并在一个地方进行更改。

谢谢!

【问题讨论】:

【参考方案1】:

文本更改时未设置为大写。在覆盖的UILabel 中的text 属性的didSet 部分转换为大写。

如果您想更改通过 Interface Builder 设置文本的标签的文本,请同时覆盖 awakeFromNib

class CustomLabel: UILabel 
    override var text: String? 
        didSet 
            super.text = text?.uppercased()
        
    

    override func awakeFromNib() 
        super.awakeFromNib()

        super.text = text?.uppercased()
    

【讨论】:

我认为你需要在你的 didSet 中调用super.text = text?.uppercased() @rbaldwin 啊,当然。我创建了一个无限循环。谢谢!

以上是关于如何大写来自 Swift 子类的 UILabel 的文本属性的主要内容,如果未能解决你的问题,请参考以下文章

将UILabel子类从Objective-C转换为Swift

swift UILabel子类使得设置填充非常容易。

Swift UILabel子类自动调用enum switch函数

无法在 Swift 中使用来自 Firebase 的数据立即加载 UIImageView 和 UILabel

swift UILabel中的多行文本(来自http://stackoverflow.com/a/990244/1135737)

使用约束时不显示 UILabel 子类