2010-11-20 19 views
1

私のアプリケーションの設定ビューにUISwitch状態を維持しようとしています。基本的にはUITableViewであり、ユーザーの好みを得るためのいくつかのスイッチが含まれています。以下のコードは、スイッチがどのように構成されているかを説明しています(1つのスイッチ構成のみが以下に示されており、他のものも同じように構築されています)。NSUserDefaultsを使用してUISwitch状態を保存する

if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SomeIdentifierB] autorelease]; 
      if (syncStartupSwitch) { 
       syncSwitch.on = YES; 
      }else { 
       syncSwitch.on = NO; 
      } 

      [syncSwitch addTarget:self action:@selector(syncAtStartup:) forControlEvents:UIControlEventValueChanged]; 


      NSLog(@"Why is this not working%@",(syncSwitch.on ? @"YES" : @"NO")); 
       [cell.contentView addSubview:syncSwitch]; 
      cell.accessoryView = syncSwitch; 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
       //cell.reuseIdentifier = @"Cell1"; 
     } 
     cell.textLabel.text =cellValue; 
     return cell; 
    } 

ここでは、NSUserDefaultsを使用してスイッチの状態を保存します。だから私のセレクタメソッドの実装では、私はこのようなNSUserDefaultsを定義した:

-(void) syncAtStartup:(id)sender { 
    if ([sender isOn]) { 
     [[NSUserDefaults standardUserDefaults] 
     setObject:@"YES" forKey:@"SyncAtStartup"]; 
     [[NSUserDefaults standardUserDefaults]synchronize]; 
     NSLog(@"%@",(syncStartupSwitch ? @"YES" : @"NO")); 

    }else { 
     [[NSUserDefaults standardUserDefaults] 
     setObject:@"NO" forKey:@"SyncAtStartup"]; 
      //syncStartupSwitch = [[NSUserDefaults standardUserDefaults]boolForKey:@"SyncAtStartup"]; 

    } 
} 

は最後に、私のviewDidLoadで、私はこのコード行を書いた:

syncStartupSwitch = [[NSUserDefaults standardUserDefaults]boolForKey:@"SyncAtStartup"]; 

私は私にいくつか欠落しているロジックがあると確信しています実装。誰かが欠陥を指摘して私を修正できますか?

UPDATE: 私は@jfalexvijayからの提案を取り、以下のコードを使用:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SyncAtStartup"]; 
BOOL syncStartupSwitch = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"]; 

を私はPreferencesフォルダの中に見たとき、私はそれでBOOL値で作成したばかりのplistを参照してください。私は上のアプリケーションを再起動した後、まだApplicationWillTerminateにし、セレクタ自体に

[[NSUserDefaults standardUserDefaults]synchronize]; 

をこのコード行をも持っている

syncSwitch.on = syncStartupSwitch; 

:私は、このようcellForRowAtIndexPathメソッドにUISwitchの状態を設定しようシミュレータまたはデバイスでは、スイッチの状態は復元されません。

上記のコードで私の間違いはありますか?

乾杯、

ISEE

+0

"setObject"を使用する場合は、値を取得するために "boolForKey"を使用しないでください。あなたはvalueForKeyを使うべきです。 – jfalexvijay

答えて

3

次のコードを使用できます。


[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SyncAtStartup"]; 
BOOL test = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"]; 

次のコードを使用すると、YESを返します。


[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"SyncAtStartup"]; 
BOOL test = [[NSUserDefaults standardUserDefaults] boolForKey:@"SyncAtStartup"]; 

上記のコードをテストするだけです。

+0

こんにちは、提案していただきありがとうございます。上記のコードは正常に動作しています。私はplistファイルがBOOLで更新されているのを見ることができますが、私はまだBOOLを取得することができず、それに応じてUISwitchを設定することはできません。 – iSee

+0

私は次のサンプルでテストしました。 ([[NSUserDefaults standardUserDefaults] boolForKey:@ "SyncAtStartup"])syncSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@ "SyncAtStartup"]; else //警告を表示します。それはうまく動作しています – jfalexvijay

+0

私は悪い私はUISwitchにBOOLの値を割り当てることに間違っていた...私は私の問題を解決した最高の答えと考えていただきありがとうございます。 – iSee

1

代わりsetObjectメソッドを使用しての:forKey:使用してみてくださいsetBool:forKey:。

 
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"SyncAtStartup"]; 
+0

"TRUE"ではなく "YES"を使用することを除いて。 –

+1

YESと@ "YES"は間違いなく同じものです。 – taskinoor

+1

YES/NOとTRUE/FALSEの間に実用的な相違はほとんどありません。 – taskinoor

関連する問題