Ниже мой 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, даже если он хранится как строка? Любая помощь будет очень признательна.
Вы держите 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];
?
Вам действительно нужно объяснить, почему ваши цвета хранятся в виде строкового представления кода Objective-C, потому что это вообще не имеет смысла.
Нет смысла хранить код Objective-C в строке, а затем пытаться использовать эту строку позже.
Я спрашиваю, почему вы делаете что-то настолько необычное, чтобы я мог дать полезный ответ. Ни в одном из примеров в вашем комментарии вы бы не поместили код Objective-C в строку. Так зачем это делать для UIColor?
Позвольте нам продолжить обсуждение в чате.
Извините, @rmaddy, у моего клиента особые требования, и мы предложили это решение.
После просмотра недавно добавленного кода это только самое худшее. Если вы хотите, чтобы цвет был динамически сохранен в виде строки шестнадцатеричного значения. В противном случае сделайте это UIColor
@rmaddy, мы отправляем код UIColors с сервера, поскольку нам нужно динамически изменять цвета UITableViewCells. Итак, мы отправляем UIColor через JSON как NSString.
Но вы отправляете код Objective-C в виде строк. Есть НАМНОГО лучших способов представить цвета в виде строк. Код Objective-C в строке находится в самом низу списка. Распространенным строковым представлением является код CSS3 RGB в формате «#RRGGBB». Ответ "S George" ниже упоминает это и ссылается на код для этого.
@rmaddy, спасибо за полезный ответ.
Вы можете хранить шестнадцатеричные строки в своем массиве, а затем инициализировать с их помощью UIColor.
Вот несколько ссылок, которые могут оказаться полезными для работы с шестнадцатеричными строками.
Как использовать шестнадцатеричные значения цвета
Как я могу создать UIColor из шестнадцатеричной строки?
Вы должны уточнить, показав это в действии, поскольку у вас есть правильный ответ. Я делаю это с помощью приложения, и цвета хранятся в Json, поэтому я знаю, что это правильно.
Осталось без выбора, и все предлагают использовать шестнадцатеричную строку, поэтому я использую вышеуказанное решение.
@Madhu Имейте в виду, что использование независимого от языка стандартного формата для ваших цветовых строк с вашего сервера также значительно упрощает работу с вашими цветами, и вы можете написать код на любом языке для анализа шестнадцатеричных строк.
Вы можете попробовать сохранить значения 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];
}
Вы пытаетесь создать здесь массив со строкой. Лучше создать массив с шестнадцатеричным кодом цветов и обращаться к ним с помощью индекса.