objective-c 将 UIColor 保存到 NSUserDefaults 并从 NSUserDefaults 加载

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1275662/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 22:04:31  来源:igfitidea点击:

Saving UIColor to and loading from NSUserDefaults

objective-ccocoa-touchnsuserdefaultsuicolor

提问by Unreality

What's the easiest way to save a UIColorinto NSUserDefaultsand then get it back out?

将 aUIColor存入NSUserDefaults然后将其取出的最简单方法是什么?

回答by Wevah

One way of doing it might be to archive it (like with NSColor, though I haven't tested this):

一种方法可能是将其存档(例如使用 NSColor,但我尚未对此进行测试):

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];

And to get it back:

并取回它:

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

回答by Andrew

With the accepted answer, you'll quickly end up with a lot of NSKeyed archives & unarchives all over your code. A cleaner solution is to extend UserDefaults. This is exactly what extensions are for; UserDefaults probably doesn't know about UIColor as it is because UIKit and Foundation are different frameworks.

有了接受的答案,您很快就会在代码中得到大量 NSKeyed 存档和取消存档。一个更简洁的解决方案是扩展 UserDefaults。这正是扩展的用途;UserDefaults 可能不了解 UIColor,因为 UIKit 和 Foundation 是不同的框架。

Swift

迅速

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)
    }

}

Swift 4.2

斯威夫特 4.2

extension UserDefaults {

    func color(forKey key: String) -> UIColor? {

        guard let colorData = data(forKey: key) else { return nil }

        do {
            return try NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: colorData)
        } catch let error {
            print("color error \(error.localizedDescription)")
            return nil
        }

    }

    func set(_ value: UIColor?, forKey key: String) {

        guard let color = value else { return }
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: false)
            set(data, forKey: key)
        } catch let error {
            print("error color key data not saved \(error.localizedDescription)")
        }

    }

}

Usage

用法

UserDefaults.standard.set(UIColor.white, forKey: "white")
let whiteColor = UserDefaults.standard.color(forKey: "white")

This can also be done in Objective-C with a category.

这也可以在带有类别的 Objective-C 中完成。

I've added the Swift file as a gist here.

我已经添加了斯威夫特文件作为依据这里

回答by Unreality

I've got the answer by myself

我自己有答案

Save

节省

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"];

Load

加载

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
UIColor* tColor = [UIColor colorWithRed:[prefs floatForKey:@"cr"] green:[prefs floatForKey:@"cg"] blue:[prefs floatForKey:@"cb"] alpha:[prefs floatForKey:@"ca"]];

回答by lifjoy

Thanks for Erica's UIColor category. I did not really like saving 4 floats in the preferences, and just wanted a single entry.

感谢Erica 的 UIColor 类别。我真的不喜欢在首选项中保存 4 个浮点数,只想要一个条目。

So using Erica's UIColorcategory, I was able to convert the RGBcolor to/from an NSStringwhich can be saved in the preferences.

因此,使用 Erica 的UIColor类别,我能够将RGB颜色转换为NSString可以保存在首选项中的RGB颜色。

// 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];
}

回答by Jovan Stankovic

I needed to store array of UIColorobjects in User Defaults. Idea, as stated in other answers, is to convert UIColorto Data and save that data. I've made extension on UIColor:

我需要UIColor在用户默认值中存储对象数组。正如其他答案中所述,想法是转换UIColor为数据并保存该数据。我已经扩展了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
   }
}

Usage:

用法:

fileprivate var savedColors: [UIColor]? {
    get {
        if let colorDataArray = UserDefaults.standard.array(forKey: Constants.savedColorsKey) as? [Data] {
            return colorDataArray.map { UIColor.color(withData: 
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)
    }
}
)! } } return nil } set { if let colorDataArray = newValue?.map({
let colorKey = "favoriteColor"

UserDefaults.standard.setColor(UIColor.red, forKey: colorKey)
let favoriteColor = UserDefaults.standard.color(forKey: colorKey)

print("favoriteColor is red: '\(favoriteColor == UIColor.red)'")
.data() }) { UserDefaults.standard.set(colorDataArray, forKey: Constants.savedColorsKey) } } }

回答by Mobile Dan

Swift 3, UserDefaultsExtension

Swift 3,UserDefaults扩展

private let colorPickerKey = "ColorPickerKey"

var selectedColor: UIColor? {
    get {
        guard let colorData = UserDefaults.standard.object(forKey: colorPickerKey) as? Data,
            let color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor else { return nil }
        return color
    } set {
        guard let newValue = newValue else {
            UserDefaults.standard.removeObject(forKey: colorPickerKey)
            return
        }
        let colorData = NSKeyedArchiver.archivedData(withRootObject: newValue)
        UserDefaults.standard.set(colorData, forKey: colorPickerKey)
    }
}

Example Use

示例使用

 NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
[userDefaults setObject:someColorObject forKey:@"myColor"];


This answer is based on a previous answer. It is updated for Swift 3.


此答案基于先前的答案。它已针对 Swift 3 进行了更新。

回答by Warif Akhand Rishi

Swift

迅速

NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
UIColor *someColor = (UIColor *)[userDefaults objectForKey:@"myColor"];

回答by zpesk

Edit 2:I seem to have found the answer. Check out the article by Erica Sadun on extending UIColor.

编辑 2:我似乎找到了答案。查看 Erica Sadun 关于扩展 UIColor 的文章。

Edit:This code does not seem to work for a UIColor Object. Not sure why...

编辑:此代码似乎不适用于 UIColor 对象。不知道为什么...

Here is some code to take a look at:

下面是一些代码来看看:

Saving an object into NSUserDefaults:

将对象保存到 NSUserDefaults 中:

##代码##

Reading an object from NSUserDefaults:

从 NSUserDefaults 读取对象:

##代码##