55

に保存してから戻す最も簡単な方法は何UIColorですかNSUserDefaults?

4

8 に答える 8

134

それを行う1つの方法は、それをアーカイブすることかもしれません(私はこれをテストしていませんが、NSColorのように):

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

そしてそれを取り戻すには:

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
于 2009-08-14T02:42:00.810 に答える
74

受け入れられた答えを使用すると、コード全体に多くの NSKeyed アーカイブとアーカイブ解除がすぐに発生します。よりクリーンなソリューションは、UserDefaults を拡張することです。これはまさに拡張機能の目的です。UIKit と Foundation はフレームワークが異なるため、UserDefaults はおそらく UIColor をそのまま認識していません。

迅速

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

}

スウィフト 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)")
        }

    }

}

使用法

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

これは、カテゴリを使用して Objective-C で行うこともできます。

ここに Swift ファイルを要点として追加しました。

于 2015-06-01T15:00:46.090 に答える
7

答えは自分で持っている

保存

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"]];
于 2009-08-14T02:52:43.543 に答える
5

エリカのUIColorカテゴリをありがとう。設定に4つのフロートを保存するのはあまり好きではなく、1つのエントリが必要でした。

そこで、エリカのUIColorカテゴリを使用して、設定に保存できるRGBカラーとの間で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];
}
于 2009-09-26T22:34:35.573 に答える
-4

編集 2:答えが見つかったようです。UIColor の拡張に関する Erica Sadun の記事を参照してください。

編集:このコードは、UIColor オブジェクトでは機能しないようです。理由がわからない...

ここにいくつかのコードがあります:

オブジェクトを NSUserDefaults に保存する:

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

NSUserDefaults からオブジェクトを読み取る:

NSUserDefaults *userDefaults =[NSUserDefaults standardUserDefaults];
UIColor *someColor = (UIColor *)[userDefaults objectForKey:@"myColor"];
于 2009-08-14T02:10:39.973 に答える