0

これは、新しいオブジェクトを作成するために使用するコードです。新しいオブジェクトを保存しないことを選択すると、空のテーブルビューセルが作成されます。どうすればそれを防ぐことができますか?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Add"]) {
        NSLog(@"Setting PersonsTVC as a delegate of PersonDetailTVC");
        StepDetailView *personDetailTVC = segue.destinationViewController;
        personDetailTVC.delegate = self;
        personDetailTVC.title = @"Add New Step";
        NSLog(@"Creating a new person and passing it to PersonDetailTVC");
        Step *newPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Step"
                                                        inManagedObjectContext:self.managedObjectContext];

        personDetailTVC.person = newPerson;
    }
    else {
        NSLog(@"Unidentified Segue Attempted!");
    }
}

私がこれまでに試したことは、後に以下のコードを挿入することです personDetailTVC.person = newPerson;

if (newPerson.name == nil) {
    [self.managedObjectContext deleteObject:newPerson];
    [self.managedObjectContext save:nil];

    [self performFetch];
    [self.tableView reloadData];
}

ただし、テーブルビューセルが削除されず、オブジェクトのみが削除されるため、アプリがクラッシュするため、これは適切な解決策ではありません。私ができると思ったのは、オブジェクトがnullの場合、最初のテーブルビューセルを自動的に削除することですが、その方法が見つかりませんでした。

助言がありますか?

4

1 に答える 1

0

私はここで何が起こっていると思うかを推測しています。間違っている場合は、私の仮定を修正してください。

  • UITableView を取得しました
  • セルには、CoreData からのデータが入力されます。
  • そして、NSFetchedResultsController を介してそれを設定しています
  • 次は、ユーザーが新しい管理対象オブジェクトのデータを入力できるようにする PersonDetailVC への接続ですか?

「insertNewObjectForEntity:」を実行すると、新しい空白の managedObject が作成され、Core Data に挿入されます。NSFetchedResultsController に変更が通知され、新しいセルが UITableView に挿入されます。NSFetchedResultsController は変更を取得し、空白のセルを追加します。

コンテキストを保存するかどうかに関係なく、それは既にコア データ ストアにあります。「保存」は、変更がコア データの永続ストア (sqlite または plist) に反映されていることを確認するだけです。コア データはメモリ内に存在し、sqlite 永続ストアは永続化のみを目的としています。

解決策は、ユーザーがデータを入力するまでコア データに挿入しないことです。セグエ内でコア データの挿入を行うべきではありません。

解決策: - 新しいオブジェクトを作成せずに PersonDetailVC にセグエします。- ユーザーがデータの入力を終了したら、ユーザーは「保存」または「完了」を押します。PersonDetailVC からポップバックするときに、入力されたフィールドを使用してコア データに新しい managedObject を挿入します。- NSFetchedResultsController は変更を取得し、UITableView を適切に変更します。

注: NSFetchedResultsController を使用している場合は、[self.tableview reloadData] する必要はありません。fetchedresultscontroller は、すべての変更を結合した後に呼び出します。

于 2013-02-06T22:20:53.700 に答える