Сбой пользовательского поля iOS 14 с textColor = [ UIColor colorWithCIColor:]

#objective-c #uitextfield #runtime #uicolor

#objective-c #uitextfield #время выполнения #uicolor

Вопрос:

Сбой:

 - (void)viewDidLoad
{
    [ super viewDidLoad ];
    
    UITextField * textField = [ [ UITextField alloc ] init ];
    textField.textColor = [ UIColor colorWithCIColor:[ CIColor colorWithString:@"0 0 0 1" ] ];
    [ self.view addSubview:textField ];
}
 

Консоль Xcode:

не удалось выполнить код поддержки для чтения данных класса Objective-C. Это может снизить качество доступной информации о типе.

Не сбой:

 - (void)viewDidLoad
{
    [ super viewDidLoad ];
    
    UITextField * textField = [ [ UITextField alloc ] init ];
    textField.text = @"text";
    textField.textColor = [ UIColor colorWithCIColor:[ CIColor colorWithString:@"0 0 0 1" ] ];
    [ self.view addSubview:textField ];
}
 

в пустом проекте и пустом UIViewController. iOS 14.2 / iPhone XS / Xcode 12.2 (12B45b).

Также происходит сбой после очистки всего существующего текста в UITextFiled.

Комментарии:

1. Выглядит как действительно забавная причудливая ошибка. Я думаю, что это какая-то проблема с инициализацией. Если вы это сделаете, например UIColor.blackColor , тогда все в порядке. Другой способ решить эту проблему — установить текст на что угодно, и он работает, но установить его, например @"" , на пустую строку, и он снова вылетает. (PS — люблю ваш широкоформатный синтаксис)

2. И что такое журнал сбоев / реальная ошибка? Потому что это предупреждение, а не ошибка сбоя. Может быть, трассировка стека?

Ответ №1:

Я проверил этот сбой в тестовом приложении. Оказывается, это бесконечно саморекурсивный сбой, связанный со стеком (см. Трассировка стека).

Сбой происходит из-за того, как вы инициализируете свой UIColor из CIColor. Это очень нетрадиционно. Объекты CIColor действительно предназначены для использования в контексте CoreImage.

Если вы это сделаете textField.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; , сбоя не будет.

При всем этом ваш код, вероятно, не должен сбоить, и, скорее всего, это ошибка в API. Возможно, стоит отправить отчет об ошибке.

введите описание изображения здесь