2012-07-30 72 views
1

這應該將兩個UISwitch的值保存到NSUserDefaults,然後根據保存爲默認值的值設置加載開關。我一直在這個小時,但我似乎無法讓它工作。任何幫助將不勝感激。嘗試使用NSUserDefaults保存並設置UISwitch狀態

切換位於我用於設置的視圖中。只有兩個切換,所以我想使用NSUserDefaults。切換默認爲OFF。我想切換到開,並保存更改,以便根據切換值更改用戶體驗。然後,當用戶再次打開設置時,我希望它們顯示當前保存的狀態。

我認爲這個值正在保存,但是當我重新進入設置視圖時它沒有被應用到交換機上。

- (IBAction)setBeadVibratorBySwitchState:(id)sender 
{ 
    if (setBeadVibrator.selected == YES) { 
     NSUserDefaults *beadSettings = [NSUserDefaults standardUserDefaults]; 
     [beadSettings setBool:NO forKey:@"beadSwitchStatus"]; 
     [beadSettings synchronize]; 
    } 
    if (setBeadVibrator.selected == NO) { 
     NSUserDefaults *beadSettings = [NSUserDefaults standardUserDefaults]; 
     [beadSettings setBool:YES forKey:@"beadSwitchStatus"]; 
     [beadSettings synchronize]; 
    } 

    NSLog(@"Bead Executed"); 
} 

- (IBAction)setDecadeVibratorBySwitchState:(id)sender 
{ 
    if (setDecadeVibrator.selected == YES) { 
     NSUserDefaults *decadeSettings = [NSUserDefaults standardUserDefaults]; 
     [decadeSettings setBool:NO forKey:@"decadeSwitchStatus"]; 
     [decadeSettings synchronize]; 
    } 
    if (setDecadeVibrator.selected == NO){ 
     NSUserDefaults *decadeSettings = [NSUserDefaults standardUserDefaults]; 
     [decadeSettings setBool:YES forKey:@"decadeSwitchStatus"]; 
     [decadeSettings synchronize]; 
    } 

    NSLog(@"Decade Executed"); 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    setBeadVibrator.selected = [[NSUserDefaults standardUserDefaults] boolForKey:@"beadSwitchStatus"]; 
    setDecadeVibrator.selected = [[NSUserDefaults standardUserDefaults] boolForKey:@"decadeSwitchStatus"]; 

} 
+0

您能否描述一下您使用此代碼的問題?當你運行你的代碼時,你預期發生的事情不會發生嗎? – dasblinkenlight 2012-07-30 02:13:32

+0

已編輯。謝謝! – Sneagan 2012-07-30 02:52:39

+0

您是否嘗試從'viewDidLoad'切換到'viewWillAppear'? – dasblinkenlight 2012-07-30 02:57:21

回答

1

NSUserDefaults只能存儲NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary類型的對象。所以,我建議你把交換機的狀態放在一個NSString中,並把該字符串放在NSUserDefaults中。與從NSUserDefaults中檢索信息時相比,您可以使用if語句再次設置布爾值的值。

+1

好主意。非常感謝輸入。我會給它一個鏡頭。 – Sneagan 2012-08-19 17:19:25

+0

沒問題。我在我的應用程序中使用了這種方法,它工作。 – 2012-08-25 19:28:26

1

如果您正在使用UISwitch,應設置on屬性,而不是selected

setBeadVibrator.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"beadSwitchStatus"]; 
setDecadeVibrator.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"decadeSwitchStatus"]; 

看到UISwitch Class Reference

+0

似乎它應該有效,但最終結果是一樣的。 :/ – Sneagan 2012-07-30 05:16:45

+0

您還需要檢查而不是在您的操作方法中選擇,並確保操作鏈接到交換機的「值更改」操作。 – jrturton 2012-07-30 05:27:42

0

我建議你把的NSLog語句的if語句,看看他們是否真的得救了。如果沒有,您的UISwitch可能無法使用UIControlEventValueChanged事件正確配置。

您可以從Apple doc瞭解更多信息。以下是關於使用UISwitch的非常詳細的website

+0

極好的推薦!似乎沒有注意到從「關」到「開」的變化。你能推薦一些東西給我做或我可以閱讀的東西,以幫助我更好地處理這個問題嗎? 再次感謝! – Sneagan 2012-07-30 22:05:27

+0

編輯我的答案,包括進一步閱讀的一些鏈接。 – Rick 2012-07-31 03:10:41

+0

謝謝!我還有另一個項目正在進行中,但我會盡快進行測試。 – Sneagan 2012-08-04 23:32:17