Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:
object o = null;
DateTime d = (DateTime)o;
Он выкинет NullReferenceException
в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.
Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:
" />
Здесь SelectedDate
на самом деле является свойством - типа DateTime
- типа Calendar
Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException
, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...
Вы близки, но colorWithRed: green: blue: alpha: ожидает значения от 0.0 до 1.0, поэтому вам нужно сдвинуть биты вправо и разделить на 255.0f:
CGFloat red = ((baseColor1 & 0xFF0000) >> 16) / 255.0f;
CGFloat green = ((baseColor1 & 0x00FF00) >> 8) / 255.0f;
CGFloat blue = (baseColor1 & 0x0000FF) / 255.0f;
EDIT. Также сканирование NSScannerHexInt пропустит минус 0x перед шестнадцатеричной строкой, но я не думаю, что он пропустит символ # перед вашей шестнадцатеричной строкой. Вы можете добавить эту строку, чтобы обработать это:
[scanner2 setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]];
ссылаются на эту ссылку для преобразования шестнадцатеричной строки в объектный код c
http://www.touch-code-magazine.com/web-color-to-uicolor-convertor
Я добавил замену строки, поэтому он принимает шестую строку с или без #
Возможный полный код:
+ (UIColor *)colorWithHexString:(NSString *)stringToConvert
{
NSString *noHashString = [stringToConvert stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the #
NSScanner *scanner = [NSScanner scannerWithString:noHashString];
[scanner setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; // remove + and $
unsigned hex;
if (![scanner scanHexInt:&hex]) return nil;
int r = (hex >> 16) & 0xFF;
int g = (hex >> 8) & 0xFF;
int b = (hex) & 0xFF;
return [UIColor colorWithRed:r / 255.0f green:g / 255.0f blue:b / 255.0f alpha:1.0f];
}
charactersToBeSkipped
на сканере необходимость в замене строки #
?
– devios1
27 April 2015 в 20:55
Я выполнил функцию, которая работает в следующих случаях: - 1) с или без # 2) и длинные значения 3 и 6 символов # 000, а также # 000000 3) В случае дополнительных цифр более шести он игнорирует дополнительные цифры
//Function Call
UIColor *organizationColor = [self colorWithHexString:@"#AAAAAAAAAAAAA" alpha:1];
//Function
- (UIColor *)colorWithHexString:(NSString *)str_HEX alpha:(CGFloat)alpha_range{
NSString *noHashString = [str_HEX stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the #
int red = 0;
int green = 0;
int blue = 0;
if ([str_HEX length]<=3)
{
sscanf([noHashString UTF8String], "%01X%01X%01X", &red, &green, &blue);
return [UIColor colorWithRed:red/16.0 green:green/16.0 blue:blue/16.0 alpha:alpha_range];
}
else if ([str_HEX length]>7)
{
NSString *mySmallerString = [noHashString substringToIndex:6];
sscanf([mySmallerString UTF8String], "%02X%02X%02X", &red, &green, &blue);
return [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range];
}
else
{
sscanf([noHashString UTF8String], "%02X%02X%02X", &red, &green, &blue);
return [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range];
}}