Сохранение UIColor и загрузка из NSUserDefaults
Какой самый простой способ сохранить UIColor
в NSUserDefaults
а затем вернуть его обратно?
- Перетаскивание UIView внутри UIScrollView
- Статическая строковая переменная в Objective C на iphone
- Переменная Property vs. instance
- Как я могу нажать кнопку за прозрачным UIView?
- Использование Swift CFunctionPointer для передачи обратного вызова API CoreMIDI
- Сохранение изображения в plist
- Как передать объект с помощью NSNotificationCenter
- Содержимое HTML соответствует UIWebview без масштабирования
С принятым ответом вы быстро получите множество архивов и разделов NSKeyed по всему вашему коду. Более чистым решением является расширение UserDefaults. Это именно то, для чего нужны расширения; UserDefaults, вероятно, не знает о UIColor, поскольку это потому, что UIKit и Foundation – разные каркасы.
стриж
extension UserDefaults { func color(forKey key: String) -> UIColor? { var color: UIColor? if let colorData = data(forKey: key) { color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor } return color } func set(_ value: UIColor?, forKey key: String) { var colorData: Data? if let color = value { colorData = NSKeyedArchiver.archivedData(withRootObject: color) } set(colorData, forKey: key) } }
Применение
UserDefaults.standard.set(UIColor.white, forKey: "white") let whiteColor = UserDefaults.standard.color(forKey: "white")
Это также можно сделать в Objective-C с категорией.
Здесь я добавил файл Swift.
Один из способов сделать это – это архивировать его (например, с помощью NSColor, хотя я не тестировал это):
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color]; [[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];
И вернуть его:
NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"]; UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
У меня есть ответ сам
Сохранить
const CGFloat *components = CGColorGetComponents(pColor.CGColor); NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setFloat:components[0] forKey:@"cr"]; [prefs setFloat:components[1] forKey:@"cg"]; [prefs setFloat:components[2] forKey:@"cb"]; [prefs setFloat:components[3] forKey:@"ca"];
нагрузка
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; UIColor* tColor = [UIColor colorWithRed:[prefs floatForKey:@"cr"] green:[prefs floatForKey:@"cg"] blue:[prefs floatForKey:@"cb"] alpha:[prefs floatForKey:@"ca"]];
Спасибо за категорию UIColor от Erica . Мне не нравилось сохранять 4 поплавки в настройках, и мне просто нужна была одна запись.
Поэтому, используя категорию UIColor
Erica, я смог преобразовать цвет RGB в / из NSString
который можно сохранить в настройках.
// Save a color NSString *theColorStr = [self.artistColor stringFromColor]; [[NSUserDefaults standardUserDefaults] setObject:theColorStr forKey:@"myColor"]; // Read a color NSString *theColorStr = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"]; if ([theColorStr length] > 0) { self.myColor = [UIColor colorWithString:theColorStr]; } else { self.myColor = [UIColor colorWithRed:88.0/255.0 green:151.0/255.0 blue:237.0/255.0 alpha:1.0]; }
Swift 3, расширение UserDefaults
extension UserDefaults { internal func color(forKey key: String) -> UIColor? { guard let colorData = data(forKey: key) else { return nil } return NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor } internal func setColor(_ color: UIColor?, forKey key: String) { let colorData: Data? if let color = color { colorData = NSKeyedArchiver.archivedData(withRootObject: color) } else { colorData = nil } set(colorData, forKey: key) } }
Пример использования
let colorKey = "favoriteColor" UserDefaults.standard.setColor(UIColor.red, forKey: colorKey) let favoriteColor = UserDefaults.standard.color(forKey: colorKey) print("favoriteColor is red: '\(favoriteColor == UIColor.red)'")
Этот ответ основан на предыдущем ответе . Он обновляется для Swift 3.
Мне нужно было хранить массив объектов UIColor
в настройках по умолчанию пользователя. Идея, как указано в других ответах, заключается в преобразовании UIColor
в Data и сохранении этих данных. Я сделал расширение на UIColor
:
extension UIColor { func data() -> Data { return NSKeyedArchiver.archivedData(withRootObject: self) } class func color(withData data: Data) -> UIColor? { return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIColor } }
Применение:
fileprivate var savedColors: [UIColor]? { get { if let colorDataArray = UserDefaults.standard.array(forKey: Constants.savedColorsKey) as? [Data] { return colorDataArray.map { UIColor.color(withData: $0)! } } return nil } set { if let colorDataArray = newValue?.map({ $0.data() }) { UserDefaults.standard.set(colorDataArray, forKey: Constants.savedColorsKey) } } }
Изменить 2: Кажется, я нашел ответ . Просмотрите статью Эрика Садун о расширении UIColor.
Изменить: этот код не работает для объекта UIColor. Не знаю, почему …
Вот несколько кодов, чтобы посмотреть:
Сохранение объекта в NSUserDefaults:
NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults]; [userDefaults setObject:someColorObject forKey:@"myColor"];
Чтение объекта из NSUserDefaults:
NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults]; UIColor *someColor = (UIColor *)[userDefaults objectForKey:@"myColor"];