Сохранение UIColor и загрузка из NSUserDefaults

Какой самый простой способ сохранить UIColor в NSUserDefaults а затем вернуть его обратно?

С принятым ответом вы быстро получите множество архивов и разделов 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"]; 
  • Как работает новый механизм автоматического подсчета ссылок?
  • Округлые углы только на вершине UIView
  • В чем разница между «отображаемым именем пакета» и «именем пакета» в информационном plist приложения cocoa
  • objective @ Символ перед строк?
  • Проблема автосохранения кадра UICollectionViewCell contentView в ячейке прототипа Storyboard (Xcode 6, iOS 8 SDK) происходит при запуске только на iOS 7
  • Как resize NSImage
  • Ошибка с NSJSONSerialization - Недопустимый тип записи JSON (меню)
  • Как заставить приложение запускать NSTimer в фоновом режиме?
  • Получение видимого прямоугольника содержимого UIScrollView
  • Каков наилучший способ перетащить NSMutableArray?
  • Данные о сердечном ритме на яблоне
  • Давайте будем гением компьютера.