0

私のアプリケーションには、UITableView と 2 つのボタン "Save" と "Load" があります。私の場合、ユーザーがトラックを保存すると、UITableView がトラックのタイトルを含む新しいセルを追加し、ユーザーがセルをタップすると、トラックが再ロードされます。これは正常に機能していますが、ユーザーが 1 つのトラックを保存してから別のトラックを保存しようとすると、新しく追加されたセルは 1 つのトラックのみを再ロードします。したがって、私のテーブルビューには名前を持つ 10 個のセルを含めることができますが、いずれかをタップすると、保存されるトラックは 1 つだけになります。私の質問は、各セルのデータを保存するにはどうすればよいですか? ここに私の保存機能があります:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:NSStringFromCGPoint(ball.center) forKey:@"ballPosition"];
[userDefaults synchronize];

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults];
[block1DF setObject:NSStringFromCGPoint(block1.center) forKey:@"block1Position"];
[block1DF synchronize];

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults];
[block2DF setObject:NSStringFromCGPoint(block2.center) forKey:@"block2Position"];
[block2DF synchronize];

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults];
[block3DF setObject:NSStringFromCGPoint(block3.center) forKey:@"block3Position"];
[block3DF synchronize];

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults];
[winBlockDF setObject:NSStringFromCGPoint(winBlock.center) forKey:@"winBlockPosition"];
[winBlockDF synchronize];

NSString *trackName = [[alertView textFieldAtIndex:0] text];
trackTitle.text = trackName;

[trackArray addObject:[NSString stringWithFormat:trackName,[trackArray count]+1]];
[self.myTableView reloadData];

それから私のtableViewdidSelectRowAtIndexPath:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
CGPoint ballPoint = CGPointFromString([userDefaults objectForKey:@"ballPosition"]);
[ball setCenter:ballPoint];

NSUserDefaults *block1DF = [NSUserDefaults standardUserDefaults];
CGPoint block1Point = CGPointFromString([block1DF objectForKey:@"block1Position"]);
[block1 setCenter:block1Point];

NSUserDefaults *block2DF = [NSUserDefaults standardUserDefaults];
CGPoint block2Point = CGPointFromString([block2DF objectForKey:@"block2Position"]);
[block2 setCenter:block2Point];

NSUserDefaults *block3DF = [NSUserDefaults standardUserDefaults];
CGPoint block3Point = CGPointFromString([block3DF objectForKey:@"block3Position"]);
[block3 setCenter:block3Point];

NSUserDefaults *winBlockDF = [NSUserDefaults standardUserDefaults];
CGPoint winBlockPoint = CGPointFromString([winBlockDF objectForKey:@"winBlockPosition"]);
[winBlock setCenter:winBlockPoint];
4

1 に答える 1

1

データのコピーを 1 つしか保存できないのは、バグがあるからではありません。これは、NSUserDefaults が「ballPosition」の 1 つのバージョンしか保存できないためです。別の「ballPosition」を保存すると、既存の「ballPosition」が置き換えられます。

NSUserDefaults をまったく使用しないことをお勧めします。一般に、類似したデータの多くのバージョンを保存する場合は、Core Data を使用します。

良いチュートリアルはここにあります http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-startedしかし、簡単な概要が必要な場合は、ここにあります:

Xcode で新しいプロジェクトを作成する場合は、[Master-Detail Application] を選択し、[Use Core Data] を選択すると、新しいコア データに基づくアプリケーションが作成されます。

このデモ アプリケーションは、"timestamp" というプロパティを持つ "Event" オブジェクトのテーブルを作成します。

[追加] ボタンを押すたびに、次のコードが実行されます。

- (void)insertNewObject:(id)sender
{
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template.
    [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];

    // Save the context.
    NSError *error = nil;
    if (![context save:&error]) {
         // Replace this implementation with code to handle the error appropriately.
         // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

これにより、新しい Event オブジェクトが作成され、キー timeStamp の現在の日付が設定され、オブジェクトがローカル データベースに保存されます。

ここでの大きな利点は、MVC または Modal View Controller アーキテクチャ パターンを完全に使用できるようになったことです。ビューとコントローラーから独立して動作するモーダル (およびデータベース) レイヤー全体があります。

また、UITableViewsを正しく使用しています.NSFetchedResultsControllerがあり、変更があったときはいつでもテーブルを最新の状態に保ちます.テーブルに項目を表示するための別の詳細ビューがあります.

Core Data に関して留意すべき点がいくつかあります。

  1. データベースのスキーマがあります。Xcode の xcdatamodeld ファイルからスキーマを編集できます。モデルに保存するものはすべて、ここで定義する必要があります。
  2. xcdatamodel を変更するときはいつでもアプリを再インストールできます。それ以外の場合は、スキーマの移行やさまざまなバージョンに対処する必要があります。
  3. コア データは学習するのが最も簡単なツールではありませんが、学習すると、アプリを作成する際の出発点としてはるかに優れたものになります。
于 2013-07-02T23:27:49.620 に答える