Я только что натолкнулся на очень странную проблему в пользовательском подклассе UILabel
, и мне нужна помощь, чтобы выяснить, что происходит.
Вопрос, кажется, довольно длинный, но в основном это связано ск изображениям, которые я добавил, чтобы проиллюстрировать проблему как можно лучше: -)
Большое спасибо за вашу помощь!
Класс MyHTMLLabel
использует awakeFromNib()
метод для анализа его свойства text
для HTML, такого как теги <hightlight>
, для отображения текста между этими тегами в другом цвете.
Это работало без проблем в течение многих лет. Теперь я обновил свое приложение для поддержки темного режима iOS 13 и, таким образом, назначил именованные цвета всем элементам управления.
Если MyHTMLLabel
назначен с именем Color , подсветка текста больше не работает. Полная метка отображается только в названном цвете. Если обычный цвет используется как раньше (выбран с помощью палитры цветов), все работает как прежде.
НО
Проблема возникает только в моем существующий проект . Я попытался проиллюстрировать проблему в новом проекте, но там все отлично работает ...
Точно такой же код и классы показывают разное поведение в моем существующем проекте и в демонстрационном проекте.
Таким образом, источник проблемы, кажется, скрыт где-то в моем существующем проекте, но я абсолютно не знаю, где ...
Что я пробовал:
- Чтобы облегчить изучение проблемы, я удалил весь необходимый код из
MyHTMLLabel
. В результате получается класс MyLabel
, который больше ничего не делает, чтобы заменить существующий текст цветным AttributedString
в awakeFromNib()
- . Я создал пустой
TestViewController
, который содержит только два MyLabel
экземпляра. ,Один экземпляр использует обычный цвет , в то время как другой экземпляр использует именованный цвет - При представлении
TestViewController
в свежем демонстрационном проекте tвсе нормально: оба MyLabel
s показывают цветной текст - При представлении
TestViewController
в моем существующем проекте только MyLabel
с нормальным цветом показывает цветной текст, а текст с именованным цветом показывает только названный цвет
class MyLabel: UILabel {
override func awakeFromNib() {
super.awakeFromNib()
let customText = NSMutableAttributedString.init(string: "This is blue")
customText.addAttribute(.foregroundColor, value: UIColor.blue, range: NSRange.init(location: 8, length: 4))
attributedText = customText
}
}
Наблюдения
- Тесты были выполнены с использованием точно такого же кода как в демонстрационном проекте, так и в моем существующем проекте. Проблема обнаруживается только в моем существующем проекте. Таким образом, источник проблемы, кажется, скрыт где-то в моем существующем коде.
- Существующий проект был создан 7 лет назад, работает в Objectiv-C и теперь также использует Swift. Естественно, есть тысячи отличий по сравнению с новым проектом. Проблема в том, что я понятия не имею, как искать единственное различие, которое вызывает проблему.
- Проблема появляется только тогда, когда в
awakeFromNib()
назначена цветная атрибутивная строка. Если добавить другой метод, который запускается позже (например, при нажатии кнопки) и назначает цветную атрибутивную строку, он отображается просто отлично. - Таким образом, кажется, есть какая-то разницаво внутреннем процессе настройки основывается на том, используется ли нормальный или именованный цвет.
Любая идея или совет о том, как исследовать эту проблему дальше?
Я думал опереопределив все UILabel
методы в MyLabel
, чтобы увидеть, какие из них вызваны в процессе установки / инициализации, а какие первыми используют неправильный цвет. Однако кажется, что существует около ста методов, которые могут быть перезаписаны, и процесс будет очень громоздким?
Есть ли лучшая идея, как исследовать проблему дальше?
Спасибо большое!