2012-03-15 8 views
0
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    NSUserDefaults *somet = [NSUserDefaults standardUserDefaults]; 

    NSMutableArray *anArr = [somet objectForKey:@"somedata"] ; 

    NSLog(@"anArr::: %@",anArr); 

} 

-(IBAction)addsomething:(id)sender{ 

    if (something == nil) { 
     array = [[NSMutableArray alloc] init]; 
    } 
    NSLog(@"textfieldvalue::: %@", textfield.text); 

    [array addObject:textfield.text]; 

    NSUserDefaults *something = [NSUserDefaults standardUserDefaults]; 

    [something setObject:array forKey:@"somedata"]; 

    array = [something objectForKey:@"somedata"]; 

    NSLog(@"array:: %@", array); 

} 

、私はNSMutableArrayの中で動的にデータを保存しようとした後、NSUserDefaultsでそれを保存しています。しかし、それを取得すると、私は(null)を取得しています。データも配列に保存されていません。NSMutableArrayのとNSUserdefaults発行iPhone

データを正しく保存するにはどうすればよいですか?

EDITED: 

2012-03-15 15:17:18.431 check[2686:40b] anArr::: (null) 
2012-03-15 15:17:30.160 check[2686:40b] textfieldvalue::: a 
2012-03-15 15:17:30.162 check[2686:40b] array::: (null) 
+0

ここで、 'array'をどのように初期化しますか?さらに、 'objectForKey:'は可変配列インスタンス( 'NSMutableArray')を返しません。 –

+0

私の質問を編集したことを確認してください –

+0

今はもっと混乱します。なぜ 'nil'に' something'をチェックするのですか?まだ初期化されていません。 –

答えて

3

に悪気を助けないと思いますが、ときにこれを試してくださいあなたのコードは大雑把なものです。

  1. somethingという変数は有用ではありません。期間。
  2. ローカルメソッドにsomethingという名前の変数があります。そしてあなたは、あなたのクラスの一部である何かという名前の変数を持っています。 "ローカル変数はインスタンス変数を隠す"という警告がそこにあるのです!
    おそらく、それはあなたの問題がどこから来たかです。私はあなたが本当にローカル変数の概念を理解していないと思います。そのような場合は、Objective-Cの基本的なことについてもっと読むべきです。
  3. 何かがnilであるかどうかを確認してから、何かを変更せずに配列を割り当てます。それら2人はお互いに関係がありません。そのようなコードを書かないでください。

私はあなたのためにそれを固定:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSArray *anArr = [userDefaults objectForKey:@"somedata"]; 
    NSLog(@"anArr::: %@",anArr); 
} 

-(IBAction)addsomething:(id)sender{ 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    NSLog(@"textfieldvalue::: %@", textfield.text); 
    [array addObject:textfield.text]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:array forKey:@"somedata"]; 
    array = [userDefaults objectForKey:@"somedata"]; 

    // synchronize is only needed while debugging (when you use the stop button in Xcode) 
    // you don't need this in production code. remove it for release 
    [userDefaults synchronize]; 

    NSLog(@"array:: %@", array); 
} 

しかし、最も可能性が高いあなたはuserDefaultsから得た配列にオブジェクトを保存したいです。それはローカル変数では機能しません!

あなたはこのようなものを使用します。しかし、その逐語をコピーしないでください。それを理解し、ローカル変数の詳細を読んでみてください。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
array = [[userDefaults objectForKey:@"somedata"] mutableCopy]; 
if (!array) { 
    // create array if it doesn't exist in NSUserDefaults 
    array = [[NSMutableArray alloc] init]; 
} 
NSLog(@"array in viewDidLoad: %@",array); 



NSLog(@"textfieldvalue::: %@", textField.text); 
[array addObject: textField.text]; 
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:array forKey:@"somedata"]; 

// synchronize is only needed while debugging (when you use the stop button in Xcode) 
// you don't need this in production code. remove it for release 
[userDefaults synchronize]; 
+0

非常にありがとう、コードを試しましたが、私はこの結果を得ています 2012-03-15 15:51:36.832チェック[3025:40b] textfieldvalue ::: 2012-03-15 15:51:36.845チェック[3025:40b]配列::(a) 2012-03-15 15:51:44.712チェック[3025:40b] textfieldvalue ::: b 2012-03-15 15:51:44.738チェック[3025:40b ] array ::(b) –

+0

新しい要素を追加するのではなく、前の要素を新しい要素に置き換えます。 「a」が挿入されている場合と同様にarrayは配列::(a)、その後にbを入力すると配列はarray ::(a、b)になりますが、配列には::(b) –

+2

私の答えのコードブロックとそれが何を理解しようとします。それはちょうどこれを行う必要があります。注意:arrayはインスタンス変数であり、ローカル変数ではありません。 –

3

は、コードが助けuのかもしれ次試してみてください...

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

NSUserDefaults *somet = [NSUserDefaults standardUserDefaults]; 

NSMutableArray *anArr = [[NSMutableArray alloc] init]; 
anArr = [somet objectForKey:@"somedata"] ; 
[somet synchronize]; 

NSLog(@"anArr::: %@",anArr); 

} 

-(IBAction)addsomething:(id)sender{ 

NSLog(@"textfieldvalue::: %@", textfield.text); 
//Here u have to check array is in memory allocate or not 
[array addObject:textfield.text]; 

NSUserDefaults *something = [NSUserDefaults standardUserDefaults]; 

[something setObject:array forKey:@"somedata"]; 
[something synchronize]; 

array = [something objectForKey:@"somedata"]; 

NSLog(@"array:: %@", array); 

} 
+0

nsmutable配列を割り当てて、それにオブジェクトを割り当てても、意味が一致しません。 –

+0

NSLog(@ "array ::%@"、array);それは言った(ヌル) –

+0

質問は今編集されました –

2

あなたがsetObject:forKey[[NSUserDefaults standardUserDefaults] synchronize];を呼び出す必要があります。

[something setObject:array forKey:@"somedata"]; 
[something synchronize]; 
+0

それでも試した配列はヌルです:( –

0

[something synchronize] 

データを取得する前に、この行を追加します。

+0

あなたは今、同期フェチシズムに関する私の暴言の対象になっていると申し訳ありません。 NSUserDefaultsがファイルシステムに設定を書き込むように強制するAppleはNSUserDefaultsを実装して、いつ設定を書き込む必要があるかを知ることができます(つまり、アプリがバックグラウンドになるか、終了するときなど)。 'synchronize'はデバッグ中、 Xcodeの停止ボタンを押してアプリケーションを強制停止することがありますが、そのコードはリリース時には "動作する"ため削除されることはありません。 –

+0

**結論:すべての呼び出しの後に '[userDefaults synchronize];'それはNSUserDefaultsを変更します。** NSUserDefaultsはスマートです!メモリにキャッシュされ、必要なときにのみディスクに書き込まれます。 –

+0

@MatthiasBauch。Very Insight ful.First of allコメントをいただきありがとうございます。私は同期と同様の問題を解決したが、それは重いことを実現しませんでした。私はそれを念頭に置いておきます。 – Vignesh

0

あなたがNSUserDefaults

- (void)savingObject:(NSString *)keyName data:(id)val 
{ 
    NSData *dataVal = [NSKeyedArchiver archivedDataWithRootObject:val]; 
    [defaults setObject:dataVal forKey:keyName]; 
    [defaults synchronize]; 
} 

に値を保存していて、その使用この

- (id)gettingObject:(NSString *)keyName 
{ 
    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:keyName]; 
    return [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 

を取得したいとき、私はこれがあなた

+0

NSString(textField.textなど)を保存するためにこれを行う必要はありません。 NSStringsはplistスタイルの属性なので、直接NSUserDefaultsに保存することができます –

+0

私は知っていますが、NSMutableArrayをNSUserDefaultsに追加しています。 – hchouhan02

関連する問題