Сохраненный UIColor как строки в NSMutableArray, но не может отображать цвета

Ниже мой NSMutableArray:

NSMutableArray *bgColorArr = [NSMutableArray arrayWithObjects:
    @"[UIColor colorWithRed:0.90 green:0.22 blue:0.21 alpha:1.0]",
    @"[UIColor colorWithRed:0.26 green:0.63 blue:0.28 alpha:1.0]",
    @"[UIColor colorWithRed:0.85 green:0.11 blue:0.38 alpha:1.0]",
    @"[UIColor colorWithRed:0.12 green:0.53 blue:0.90 alpha:1.0]",
    @"[UIColor colorWithRed:0.96 green:0.49 blue:0.00 alpha:1.0]",
    nil];

По какой-то причине я храню UIColors как строки. Я знаю, как хранить UIColors в NSMutableArray, но мне нужно хранить их как NSString из-за моего требования. Когда я пытаюсь отобразить цвета в cellForRowAtIndexPath, используя приведенный ниже код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *simpleTableIdentifier = .............

    cell.bgView.backgroundColor = (UIColor *)[bgColorArr objectAtIndex:indexPath.row];

    return cell;
}

Ниже приведена ошибка:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString CGColor]: unrecognized selector sent to instance

Посмотрев на указанную выше ошибку, мы можем сказать, что String не преобразуется в UIColor. Есть ли способ отобразить UIColor, даже если он хранится как строка? Любая помощь будет очень признательна.

Вы пытаетесь создать здесь массив со строкой. Лучше создать массив с шестнадцатеричным кодом цветов и обращаться к ним с помощью индекса.

MrWaqasAhmed 02.05.2018 11:33

Вы держите NSString, почему? Почему бы тебе не сделать NSMutableArray *bgColorArr = [NSMutableArray arrayWithObjects:[UIColor colorWithRed:0.90 green:0.22 blue:0.21 alpha:1.0], [UIColor colorWithRed:0.26 green:0.63 blue:0.28 alpha:1.0],[UIColor colorWithRed:0.85 green:0.11 blue:0.38 alpha:1.0],[UIColor colorWithRed:0.12 green:0.53 blue:0.90 alpha:1.0], [UIColor colorWithRed:0.96 green:0.49 blue:0.00 alpha:1.0], nil];?

Larme 02.05.2018 11:33

Вам действительно нужно объяснить, почему ваши цвета хранятся в виде строкового представления кода Objective-C, потому что это вообще не имеет смысла.

rmaddy 02.05.2018 16:57

Нет смысла хранить код Objective-C в строке, а затем пытаться использовать эту строку позже.

rmaddy 02.05.2018 18:31

Я спрашиваю, почему вы делаете что-то настолько необычное, чтобы я мог дать полезный ответ. Ни в одном из примеров в вашем комментарии вы бы не поместили код Objective-C в строку. Так зачем это делать для UIColor?

rmaddy 02.05.2018 18:40

Позвольте нам продолжить обсуждение в чате.

Madhu 02.05.2018 18:42

Извините, @rmaddy, у моего клиента особые требования, и мы предложили это решение.

Madhu 02.05.2018 18:51

После просмотра недавно добавленного кода это только самое худшее. Если вы хотите, чтобы цвет был динамически сохранен в виде строки шестнадцатеричного значения. В противном случае сделайте это UIColor

agibson007 02.05.2018 20:19

@rmaddy, мы отправляем код UIColors с сервера, поскольку нам нужно динамически изменять цвета UITableViewCells. Итак, мы отправляем UIColor через JSON как NSString.

Madhu 03.05.2018 06:52

Но вы отправляете код Objective-C в виде строк. Есть НАМНОГО лучших способов представить цвета в виде строк. Код Objective-C в строке находится в самом низу списка. Распространенным строковым представлением является код CSS3 RGB в формате «#RRGGBB». Ответ "S George" ниже упоминает это и ссылается на код для этого.

rmaddy 03.05.2018 07:01

@rmaddy, спасибо за полезный ответ.

Madhu 03.05.2018 07:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
100
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете хранить шестнадцатеричные строки в своем массиве, а затем инициализировать с их помощью UIColor.

Вот несколько ссылок, которые могут оказаться полезными для работы с шестнадцатеричными строками.

Как использовать шестнадцатеричные значения цвета

Как я могу создать UIColor из шестнадцатеричной строки?

Вы должны уточнить, показав это в действии, поскольку у вас есть правильный ответ. Я делаю это с помощью приложения, и цвета хранятся в Json, поэтому я знаю, что это правильно.

agibson007 02.05.2018 13:17

Осталось без выбора, и все предлагают использовать шестнадцатеричную строку, поэтому я использую вышеуказанное решение.

Madhu 03.05.2018 07:07

@Madhu Имейте в виду, что использование независимого от языка стандартного формата для ваших цветовых строк с вашего сервера также значительно упрощает работу с вашими цветами, и вы можете написать код на любом языке для анализа шестнадцатеричных строк.

rmaddy 03.05.2018 07:14

Вы можете попробовать сохранить значения rgb и преобразовать эти строковые значения rgb в float и поместить их в инициализатор UIColor.

Попробуйте так.

Просто включите его в свой заголовок, и он будет доступен на протяжении всего вашего проекта.

#define RGBCOLOR(r,g,b)    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]

Затем сохраните UIColors в NSMutableArray следующим образом:

NSMutableArray *colorArray=[[NSMutableArray alloc]initWithObjects:RGBCOLOR(107, 252, 0),RGBCOLOR(64, 128, 0),RGBCOLOR(51, 128, 0),RGBCOLOR(47, 128, 0),RGBCOLOR(31, 12, 155),RGBCOLOR(47, 72, 254),RGBCOLOR(86, 0, 255),RGBCOLOR(128, 24, 255),RGBCOLOR(240, 101, 255),RGBCOLOR(240, 45, 128),RGBCOLOR(129, 19, 0),RGBCOLOR(220, 18, 3),RGBCOLOR(236, 82, 9),RGBCOLOR(235, 146, 14),RGBCOLOR(255, 255, 0),RGBCOLOR(128, 64, 0),RGBCOLOR(50, 128, 63),RGBCOLOR(12, 64, 128),     RGBCOLOR(102, 102, 255),RGBCOLOR(115, 103, 61),nil];

Теперь отобразите цвета в cellForRowAtIndexPath.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 static NSString *CellIdentifier = @"Cell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {
 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
 }

 cell.bgView.backgroundColor = [colorArray objectAtIndex:indexPath.row];

 return cell;
}

это решит вашу проблему.

Вы можете добавить собственные цвета в файл Asset.xcasset следующим образом.

затем загрузите такие цвета в свой массив.

-(void)loadAllColorsFromAsset {
    NSMutableArray *array = [NSMutableArray arrayWithObjects:[UIColor colorNamed:@"redColor"],[UIColor colorNamed:@"yellowColor"],[UIColor colorNamed:@"greenColor"], nil];
}

Другие вопросы по теме