0

私はUISwitchを持っています、とりわけ魔女はUITextfieldを無効にします。NSUserDefaultsを使用する場合、現在の状態(オン/オフ)を記憶するようにスイッチを管理します

NSString *const MyPrefKey =@"MyPrefKey";


 [[NSUserDefaults standardUserDefaults]
     setBool:[sender isOn]
     forKey:MyPrefKey];

スイッチの状態は、viewDidLoadで呼び出されます。

 BOOL switchState =[[NSUserDefaults standardUserDefaults]boolForKey:MyPrefKey];
 [mySwitch setOn:switchState];

これは完璧に機能し、UISwitchの位置が記憶されます。

スイッチが変更されたときにテキストフィールドを有効にするため

私は提案されたように試しました:

 [[NSUserDefaults standardUserDefaults]
     setObject:[NSNumber numberWithBool:[myTextField isEnabled]]
     forKey:MyPrefKey];

とリコール

BOOL mtf  =[[NSUserDefaults standardUserDefaults]boolForKey:MyPrefKey];
[myTextField setEnabled:mtf];

これもうまくいきました。ただし、一度に機能するのはこれらの1つだけです。同時に設定するデフォルトを増やすにはどうすればよいですか?複数のPrefKeyを作成する必要がありますか?または、それらすべてを同じprefKeyに保存できますか?

最後に、NSUserDefaultsを使用してテキストの色を変更しようとしました

[[NSUserDefaults standardUserDefaults]
     setObject: [myTextField textColor]
     forKey: MyPrefKey];

でリコールするとクラッシュが発生します

UIColor*newColor= [[NSUserDefaults standardUserDefaults] objectForKey: EfloraSharePrefKey];
[myTextField setTextColor:newColor];

では、textColorでNSUserDefaultを使用するにはどうすればよいですか?私はどんな良い解決策にも感謝します。

4

3 に答える 3

1

プロパティリストオブジェクトはNSUserDefaultsにのみ保存できます。あなたはどういうわけかあなたの色をシリアル化する必要があります。考えられる解決策:

CGFloat r, g, b, a;
[myTextField.textColor getRed:&r green:&g blue:&b alpha:&a];
NSNumber *rn, *gn, *bn, *an;
rn = [NSNumber numberWithFloat:r];
gn = [NSNumber numberWithFloat:g];
bn = [NSNumber numberWithFloat:b];
an = [NSNumber numberWithFloat:a];
NSDictionary *color = [NSDictionary dictionaryWithObjectsAndKeys:
    rn, @"red",
    gn, @"green",
    bn, @"blue",
    an, @"alpha",
    nil];
[[NSUserDefaults standardUserDefaults] setObject:color forKey:@"TextColor"];

そしてそれを取得するには:

NSDictionary *color = [[NSUserDefaults standardUserDefaults] objectForKey:@"TextColor"];
NSNumber *rn, *gn, *bn, *an;
rn = [color objectForKey:@"red"];
...
UIColor *c = [UIColor colorWithRed:[rn floatValue]
    green:[gn floatValue]
    blue:[bn floatValue]
    alpha:[an floatValue]];
textField.textColor = c;

本当にエレガントにしたい場合は、これをカテゴリにラップし、UIColor NSCodingに準拠させることもできます(ユーザーのデフォルトのplistに直接永続化できるようにするため)。

于 2012-08-15T19:07:48.393 に答える
0

H2C03が言ったように、あなたはそれを有効なプロパティリストアイテムにする必要があります。ホバーすると、一部の色がRGB色空間にありません。ただし、NSDataをplistに入れることができ、UIColorはアーカイブをサポートします。

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];

それから反対側に...

UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
于 2012-08-15T19:17:35.227 に答える
0

NSKeyedUnarchiverを使用して、UIColorのデータをアーカイブ/アーカイブ解除できます。NSDataをNSUserDetaultsのオブジェクトとして保存します。を使用して色からNSDataを作成します

[NSKeyedArchiver archivedDataWithRootObject:yourColor]; 

を使用してアーカイブを解除します

[NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:yourColorKey]]
于 2012-08-15T19:14:51.243 に答える