-2

後で追加/削除して編集できるように、NSUserDefaults から NSMutableArray を作成しようとしています。

私のコードは

- (void)viewDidLoad {
[super viewDidLoad];

NSUserDefaults *ArrayTable = [NSUserDefaults standardUserDefaults];
[ArrayTable setObject:@"One" forKey:@"myArray"];
[ArrayTable setObject:@"Two" forKey:@"myArray"];
[ArrayTable setObject:@"Three" forKey:@"myArray"];
[ArrayTable setObject:@"Four" forKey:@"myArray"];
[ArrayTable setObject:@"Five" forKey:@"myArray"];
[ArrayTable synchronize];

NSMutableArray *array = [[NSMutableArray alloc] init];
array = [ArrayTable objectForKey:@"myArray"];
}


- (void)viewDidUnload
{
    [super viewDidUnload];
}

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    cell.textLabel.text = [array objectAtIndex:indexPath.row];
    return cell;
}

ビルドして実行しても何も表示されない

私はそれをグーグルで調べましたが、助けはありませんでした。私はそれを行う方法を理解していなかったと確信しています

私が必要とするのは、空のデータを持つテーブルビューを含むアプリを構築することです。使用すると、データの追加/削除/編集が入力されます

誰か説明してくれませんか

前もって感謝します

4

4 に答える 4

2

最初に、配列をユーザー デフォルトから という名前のローカル変数に割り当てましたarray。という名前のこのクラスのプロパティがあると仮定するとarray、このローカル割り当てはそれをマスクします。そうしないと、文字列を呼び出そうとしたときにクラッシュしていたでしょう-count

NSUserDefaultsオブジェクトは辞書です。それを呼び出すたび-setObject:forKey:に、実際にはそのキーに対して以前に設定されたオブジェクトを置き換えています。したがって、一連の への呼び出しの最後に-setObject:forKey:、結果の値はNSString Fiveになります。

実際には変更可能なオブジェクトを に格納することはできませんNSUserDefaults。代わりに、オブジェクトをローカル変数または ivar に割り当てるときに、オブジェクトの変更可能なコピーを取得します。おそらく期待している動作を得るには、次のようなことを行う必要があります。

- (void)viewDidLoad
{
  // Create the array template and store it in NSUserDefaults
  NSArray* arrayTemplate = [NSArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", @"Five", nil];
  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
  [defaults setObject:arrayTemplate forKey:@"myArray"];
  [defaults synchronize];

  // Retrieve a mutable copy of the array from user defaults and assign it to the
  // the property 'array' <- note, this should be an NSMutableArray
  self.array = [[defaults objectForKey:@"myArray"] mutableCopy]; // if not using arc, autorelease this here
}

このコード例では、期待どおりに動作するはずであり、続行できます。明らかに、配列を設定して-viewDidLoadからすぐに変更可能なコピーを読み取ることは意味がありません。心に留めておくべき重要なことは、そのキーに既に設定されているオブジェクト-setObject:forKey:を常に置き換えることです。要素などを追加しません。

于 2012-06-14T17:19:46.503 に答える
1

Your problem is that you are setting a bunch of strings all to the same key:

[ArrayTable setObject:@"yourvalue" forKey:@"myArray"];

just keeps overriding your last value. In order to save an array to your defaults you will have to go about it another way. This question may help you: array to defaults

于 2012-06-14T17:15:35.567 に答える
1

実際には NSUserDefaults の内容とは何の関係も望んでいないので、変更可能な配列を初期化する方法を尋ねているだけです。あなたがやろうとしていたことを行う方法は次のとおりです。

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"One"];
[array addObject:@"Two"];
[array addObject:@"Three"];
[array addObject:@"Four"];
[array addObject:@"Five"];

または、より簡単に:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", @"Five", nil];

(これらは完全に同一ではありません。MRC を使用している場合、最初は自分が所有するアレイを作成し、手動で解放する必要があります。2 番目は自動解放されたアレイを作成します。違いを理解していない場合は、2 番目の学ぶまでは良いですが、すぐに学びに行く必要があります。)

自分が行っていたことがうまくいかなかった理由を知りたい場合は、次のようになります。

NSUserDefaults *ArrayTable = [NSUserDefaults standardUserDefaults];

ここでは、配列でもテーブルでもない NSUserDefaults オブジェクトをコピーしています。これは、追加機能を備えた辞書のように機能する、ユーザーおよびシステム設定のラッパーです。

[ArrayTable setObject:@"One" forKey:@"myArray"];

この行は、「myArray」という名前の設定をアプリケーションのユーザー ドメイン設定に追加します。値は「One」です。

[ArrayTable setObject:@"Two" forKey:@"myArray"];
[ArrayTable setObject:@"Three" forKey:@"myArray"];
[ArrayTable setObject:@"Four" forKey:@"myArray"];
[ArrayTable setObject:@"Five" forKey:@"myArray"];

これらの行は、「myArray」設定の値を繰り返し変更し、「Five」で終わります。

[ArrayTable synchronize];

これにより、設定が確実にディスクに保存されます。

NSMutableArray *array = [[NSMutableArray alloc] init];

これにより、新しい可変配列が作成され、変数「array」に格納されます。

array = [ArrayTable objectForKey:@"myArray"];

これにより、設定から「5」文字列が取得され、変数「配列」に格納されます。

これは、実際の配列に対して持っていた唯一の参照が失われたことを意味します。

これは、変数の静的型が動的型と一致しなくなったことも意味します。後で [array count] または [array objectAtIndex:n] を呼び出すと、これらのメッセージは配列ではなく文字列に送信されるため、例外やその他の予期しない動作が発生する可能性があります。(まあ、文字列ではなく 5 つのオブジェクトの配列と話していると思っていたので、得られる結果が予期しないものになることはほぼ保証されています。)

于 2012-06-14T21:09:57.753 に答える
0

アレイを作成し、それをユーザーのデフォルトに追加します。

- (void)viewDidLoad {
//...
NSArray * tmpArray = [NSArray arrayWithObjects:@"One",@"Two",@"Three",@"Four", @"Five", nil];

NSUserDefaults *ArrayTable = [NSUserDefaults standardUserDefaults];
[ArrayTable setObject:tmpArray forKey:@"myArray"];
[ArrayTable synchronize];

array = [[ArrayTable objectForKey:@"myArray"] mutableCopy]; 
// array has to be an ivar of your viewcontroller to access it outside of viewDidLoad
// define in your header like @property (nonatomic, strong) NSMutableArray * array;
// with @synthesize array; in the implementation

}

于 2012-06-14T17:16:55.540 に答える