首页 > 解决方案 > Overriding UILabel text getter not working

问题描述

I am using Storyboards and I'd like to have some labels which always show a given emoji at the start of the label.

I have the following code:

import UIKit
import CocoaLumberjack

class PITLabel: UILabel {

    override public var text: String? {
        set {
            super.text = newValue?.prependedWithGenderEmoji()
            DDLogDebug(" set super.text: \(super.text ?? "")")
        }

        get {
            let newVal = super.text?.prependedWithGenderEmoji()
            DDLogDebug(" get super.text: \(newVal ?? "")")
            return newVal
        }
    }

    override public var attributedText: NSAttributedString? {
        set {
            super.attributedText = newValue
            DDLogDebug(" set super.attributed: \(super.attributedText ?? NSAttributedString(string: ""))")
        }

        get {
            let genderString = super.attributedText?.string.prependedWithGenderEmoji()
            let rangePointer = UnsafeMutablePointer<NSRange>.allocate(capacity: 8)
            rangePointer.pointee = NSMakeRange(0, 1)
            let originalAttributes = super.attributedText?.attributes(at: 0, effectiveRange: rangePointer)

            let newAttributedString = NSAttributedString(string: genderString!, attributes: originalAttributes)

            DDLogDebug(" get super.attributed: \(newAttributedString)")
            return newAttributedString
        }
    }

}

And I've set the labels to class PITLabel in the Storyboard.

enter image description here

enter image description here

When the app is run the following is present in the console output:

 get super.text: ‍♂️ PiT SETTINGS
 get super.attributed: ‍♂️ PiT SETTINGS{
NSColor = "UIExtendedSRGBColorSpace 0.0352941 0.498039 0.662745 1";
    <snip>
}

This is as expected.

But in the UI of the app it does not show the emoji.

enter image description here

What am I missing?

标签: swiftuikituilabeluistoryboard

解决方案


因为您实际上并没有将其添加到文本中。它应该是:

override public var text: String? {
    set {
        let result = newValue.prependedWithGenderEmoji()
        super.text = result
    }

    get {
        return super.text
    }
}

在 Interface Builder 中设置文本不会调用text您覆盖的设置器。您必须在代码中设置它。

yourPitLabel.text = "PiT SETTING


推荐阅读