2

私はそのような問題に遭遇しました。NSArrayの値を更新する必要があります。そして、それを行う方法がわかりません。これが私の配列です

NSArray *arrayWithInfo = [[NSArray alloc] initWithObjects:AMLocalizedString(@"Status", nil),AMLocalizedString(@"Call", nil),AMLocalizedString(@"Location", nil),AMLocalizedString(@"Control", nil),AMLocalizedString(@"Sim", nil),AMLocalizedString(@"Object", nil),AMLocalizedString(@"Info", nil),nil];
self.dataArray = arrayWithInfo;
[arrayWithInfo release];

具体的には、この配列でテーブルビューを初期化します。ユーザーが異なるローカライズされた文字列を使用する可能性があるため、更新する必要があります。[tableview reloadData];i'vを使用すると、テーブルを更新できますが、NSArrayの値は、最初に初期化されたものと同じままです。

では、配列で文字列をもう一度調べて、新しい値を取得するにはどうすればよいでしょうか。

4

4 に答える 4

5

NSArrayの代わりにNSMutableArrayを使用する

NSMutableArray(および名前にMutableが含まれる他のすべてのクラスは変更できます。

于 2012-10-30T12:03:41.123 に答える
3

NSMutableArrayを使用する必要があります。そうすることで、インスタンス化後にその値を変更できるようになります。

于 2012-10-30T12:04:26.910 に答える
1

配列はすべてまたはまったくないように見えるため、ここで配列を変更可能にする必要はありません。一部のオブジェクトを削除し、他のオブジェクトは削除しないという要件については言及していません。NSMutableArray必要ありません。配列が存在しない場合にそれを再インスタンス化する、配列の遅延読み込みゲッターメソッドを記述したいとします。

-(NSArray *)dataArray{
    if (_dataArray){
        return _dataArray;
    }

    _dataArray = NSArray *arrayWithInfo = [[NSArray alloc] initWithObjects:AMLocalizedString(@"Status", nil),AMLocalizedString(@"Call", nil),AMLocalizedString(@"Location", nil),AMLocalizedString(@"Control", nil),AMLocalizedString(@"Sim", nil),AMLocalizedString(@"Object", nil),AMLocalizedString(@"Info", nil),nil];
    return _dataArray;
}

次に、tableViewをリロードする場合

self.dataArray = nil;
[tableView reloadData];

これにより、古いアレイが破壊され、新しいローカリゼーションで再作成する必要があります。

編集:

問題は、配列がステートメントAMLocalizedString(@"Status", nil)を格納しておらず、そのステートメントの結果(ローカライズされた文字列自体)を格納していることです。配列全体を再作成するか、を使用してNSMutableArrayすべてのオブジェクトを変更しない限り、配列にそのステートメントを再評価させる方法はありません。遅延読み込みゲッターメソッドは、Objective-cスタイルに近いものです。

于 2012-10-30T12:12:39.270 に答える
0

を使用する必要がありますNSMutableArray。はNSArray不変です。

于 2012-10-30T12:04:02.967 に答える