問題が発生して、アプリケーションでUISwitchの状態を保持できません。私はこの問題を解決するために、さまざまなチュートリアルやコードソースからたくさんの異なる例を試していますが、私は完全な画像を見ていないと思います。UISwitchを設定して保存するNSUserDefaults値
私は、ユーザーの好みの画面を設定して、関連するコードは次のとおりです。
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Trying here to check whether user has run app previously, and if not set default switch value (as defined in IB)
NSString *firstRunValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"testSwitch"];
if (!firstRunValue) {
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"testSwitch"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return YES;
}
OptionsViewController.h
@property (weak, nonatomic) IBOutlet UISwitch *testSwitch;
OptionsViewController.m
@synthesize testSwitch;
.
.
.
- (void)viewDidLoad
{
[super viewDidLoad];
// Here's the issue - following line does NOT set switch as expected from defaults...
[testSwitch setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"testSwitch"] animated:NO];
}
.
.
.
- (IBAction)updateTest:(id)sender {
// Action called when switch is clicked to save new state, Log shows 0 or 1 as expected
[[NSUserDefaults standardUserDefaults] setBool:[sender isOn] forKey:@"testSwitch"];
NSLog(@"%@", [[NSUserDefaults standardUserDefaults]valueForKey:@"testSwitch"]);
}
.
.
.
- (IBAction)saveOptions:(id)sender {
// When user clicks "Save" and exits, I synch defaults and dump them, again output is as expected
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
[self dismissModalViewControllerAnimated:YES];
}
誰かが私が間違っている場所(Objective-Cではなく英語で)を教えてくれたら、感謝します。ありがとう!
はあなたが' NSStringの* firstRunValue = [ "testSwitch" @ [NSUserDefaults standardUserDefaults] stringForKey]から得るものにチェックしましたか? boolian値から文字列を取得しようとしています。私はそこで何が起こるか分からない。 – dasdom
NSUserDefaultsがどこに格納されているのか分かりませんが、NSUserDefaultsをどこにも見ることができませんが、NSLogにダンプすれば空白になります。しかし、それは明らかに問題でもありますが、それは問題ではありませんか? IBではデフォルトではまだOFFですが、スイッチを入れるとその状態を保持しません。 – user1326192
はい、 'if(!firstRunValue)'が常にtrueであるためです。私の答えを見てください。 – dasdom