2012-04-11 8 views
0

Ich stoße auf ein Problem, bei dem ich den Status eines UISwitch in meiner App nicht beibehalten kann. Ich denke, das Problem ist, dass ich so viele verschiedene Beispiele aus verschiedenen Tutorials und Quelltexten ausprobiert habe, um das funktionieren zu lassen, und ich sehe nur nicht das vollständige Bild.Fehler beim Setzen von UISwitch auf gespeicherten NSUserDefaults-Wert

Ich habe einen Benutzereinstellungen Bildschirm, einen entsprechenden Code aufgebaut ist:

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

Wenn mir jemand sagen könnte, wo ich falsch liege (auf Englisch und nicht in Objective-C!), Würde ich mich freuen, danke!

+0

Haben Sie überprüft, was Sie von 'NSString bekommen * firstRunValue = [[NSUserDefaults standardUserDefaults] stringForKey: @ "testSwitch"];' nach dem ersten Lauf? Sie versuchen, eine Zeichenfolge aus einem boolischen Wert zu erhalten. Ich weiß nicht, was dort passieren würde. – dasdom

+0

Ich bin nicht sicher, wo diese NSUserDefaults gespeichert sind, ich kann sie nirgends sehen, aber wenn ich es in NSLog ablege, sieht es leer aus ... überhaupt kein Wert gespeichert. Aber obwohl das natürlich auch ein Problem ist, sollte es nicht wichtig sein, oder? Es ist immer noch standardmäßig in IB ausgeschaltet, und wenn ich es einschalte, behält es diesen Zustand nicht bei. – user1326192

+0

Ja, weil 'if (! FirstRunValue)' immer wahr ist. Siehe meine Antwort. – dasdom

Antwort

0

Try this:

NSString *firstRunValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"firstRun"]; 

if (!firstRunValue) { 
    [[NSUserDefaults standardUserDefaults] setObject: @"BlaBla" forKey:@"firstRun"]; 
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"testSwitch"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
+0

Hallo, ich erhalte eine Fehlermeldung "No visible @interface for 'NSUserDefaults' deklariert den Selektor 'setString: forKey:'"? – user1326192

+0

Ich habe meine Antwort bearbeitet. 'setString: forKey:' existiert nicht. Es ist 'setObjekt: forKey:'. – dasdom

+0

Dank dasdom, das den Fehler behoben - der Code läuft alles OK jetzt, aber es ist noch nicht den Schalter richtig einstellen. Wenn ich die App benutze, ist sie standardmäßig deaktiviert (wie in IB festgelegt und jetzt auch als pref in appDelegate), wenn ich sie einschalte und speichere, bekomme ich die richtigen Einstellungen in das Protokoll, aber wenn ich wieder in die Optionen gehe Bildschirm ist es immer noch aus ... – user1326192