2015-04-09 3 views
1

Я сохраняю UIColor в NSUserDefaults, и проблема, с которой я столкнулась, заключается в том, что при восстановлении цвета возвращается простая проверка равенства (для моих тестов). Может кто-нибудь объяснить, почему это не удается?UIColor равенство не удается после его хранения в NSUserDefaults

UIColor *color = [UIColor colorWithRed: 0.922 green: 0.404 blue: 0.024 alpha: 1]; 
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color]; 

[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"]; 

NSData *storedColorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"]; 
UIColor *restoredColor = [NSKeyedUnarchiver unarchiveObjectWithData:storedColorData]; 

if ([color isEqual:restoredColor]) { 
    NSLog(@"Same color"); 
} else { 
    NSLog(@"Not the same color"); 
} 

В результате получится «Не такой же цвет». Быстрый поиск в отладчике покажет, что цвета идентичны (значения RGB и альфа).

+0

isEqual: сравнение хэшей. вам нужно сравнить компоненты вашего цвета (красный, зеленый, синий, альфа), чтобы определить, равны ли они –

ответ

2

Если объявить UIColor так:

UIColor *color = [UIColor colorWithRed: (float)0.922 green: (float)0.404 blue: (float)0.024 alpha: (float)1]; 

оба способа для сравнения цвета вернется ДА в вашем примере:

[color isEqual:restoredColor] 
CGColorEqualToColor(color.CGColor, restoredColor.CGColor) 

UPDATE: Категория для сравнения Компоненты UIColor

@interface UIColor (Compare) 

- (BOOL)isEqualToColor:(UIColor *)otherColor; 

@end 

@implementation UIColor (Compare) 

- (BOOL)isEqualToColor:(UIColor *)otherColor { 
    const CGFloat *components = CGColorGetComponents(self.CGColor); 
    float colorOne[4] = {components[0], components[1], components[2], components[3]}; 

    const CGFloat *otherComponents = CGColorGetComponents(otherColor.CGColor); 
    float colorTwo[4] = {otherComponents[0], otherComponents[1], otherComponents[2], otherComponents[3]}; 

    return colorOne[0] == colorTwo[0] && colorOne[1] == colorTwo[1] && colorOne[2] == colorTwo[2] && colorOne[3] == colorTwo[3]; 
} 

@end 
+0

Спасибо за весь ответ, но принимаю это, поскольку он объясняет что основная проблема + обеспечивает хорошее решение. –

+1

Заметил, что числа удваиваются и что простой f в конце чисел, чтобы сделать их поплавками, достаточно. Кастинг не понадобится. –

1

Может быть, этот вопрос может помочь вам: https://stackoverflow.com/a/26284626/301661

Вы можете попробовать использовать CGColorEqualToColor(color.CGColor, restoredColor.CGColor) для сравнения цвета.

+0

К сожалению, я должен был упомянуть, что CGColorEqualToColor даст мне те же результаты. –

1

Если вы NSLog оба цвета, вы увидите, что оба цвета на самом деле одинаковы!

NSLog(@"Color before: %@", color); 
NSLog(@"Color after: %@", restoredColor); 

// 2015-04-09 13:19:36.640 test[31149:6236981] Color before: UIDeviceRGBColorSpace 0.922 0.404 0.024 1 
// 2015-04-09 13:19:36.641 test[31149:6236981] Color after: UIDeviceRGBColorSpace 0.922 0.404 0.024 1 

так что вам нужно сравнить каждый компонент UIColor явно т.е. red, green, blue и alpha.

Отъезд answer!


Довольно интересно, если вы войдете хэши этих двух цветов, они тоже кажутся же

NSLog(@"Color Hash before: %lu", (unsigned long)[color hash]); 
NSLog(@"Color Hash after: %lu", (unsigned long)[restoredColor hash]); 

// 2015-04-09 13:59:06.097 test[31299:6252585] Color before: 137311944 
// 2015-04-09 13:59:06.097 test[31299:6252585] Color after: 137311944 

, чтобы вы могли сравнить хэши и получить его работу.

if(color.hash == restoredColor.hash) { 
    // ... 
} 

Как сказано в приведенном выше принятом ответе, isEqualTo: не работает, когда вы передаете double значений. float значение должно быть передано вместо

UIColor *color = [UIColor colorWithRed:0.922f green:0.404f blue:0.024f alpha:1.0f]; 
+0

Я тоже думал об этом, и это может быть решением, с которым я иду, но было бы интересно узнать, что не удалось проверить проверку равенства ... –