9

Author と Book の 2 つのエンティティがあります。Author には属性 authorName と対多関係 book があります。Book にはいくつかの属性と著者の関係があります。Author オブジェクトを編集するためのビュー コントローラ (VCAuthor) があります。子View Controller(VCBook)は、著者の本を編集するためのものです。管理対象オブジェクト コンテキストは 1 つだけです。VCBook クラスでは、次のように undomanager をグループ化します

-(void)viewDidLoad
{    
    NSUndoManager *anUndoManager = [[NSUndoManager  alloc] init];
    [self.book.managedObjectContext setUndoManager:anUndoManager];
    [anUndoManager release];
    [self.book.managedObjectContext.undoManager beginUndoGrouping];
}

-(void)cancelAction:(id)sender
{
    NSLog(@"%@", self.author.authorName);
    [self.book.managedObjectContext.undoManager endUndoGrouping];
    [self.book.managedObjectContext.undoManager undoNestedGroup];
    self.book.managedObjectContext.undoManager = nil;
    NSLog(@"%@", self.author.authorName);    
    [self dismissModalViewControllerAnimated:YES];  
}

cancelAction は、VCBook で行われたすべての変更を元に戻すために使用される VCBook のキャンセル ボタンにリンクされています。

問題はここにあります: まず、VCAuthor で、Obama から Big Obama までの UITextfiled authorNameTextField で authorName を編集し、- (void)viewWillDisappear:(BOOL)animated で author.authorName = authorNameTextField.text によって MOC に保存します。 {} 方法。次に、子ビュー コントローラー VCBook に移動して著者の書籍を編集し、キャンセル ボタンをクリックして VCAuthor に戻りました。authorName がまだオバマであることがわかりました。これは、authorName の予期された変更が元に戻されたことを意味します。authorName の変更は元に戻すグループにまったく含まれていません。なぜこれが起こるのでしょうか? ps。もちろん、VCAuthor に戻ったときにデータをリロードします。元に戻す前後に authorName を NSLog するだけです。元に戻す前の authorName は、変更された Big Obama であり、元に戻すと、Obama になります。

4

1 に答える 1

9

考慮すべきいくつかの事柄。まず、このようなシナリオでは、UNDOマネージャーの代わりに別のMOCを使用します。つまり、私はこのようなことをします(ARCを想定-必要に応じてマッピングを行うことができます)...

viewDidLoadでアクセスするため、セッターを介して本をVCに提供する他のコードが必要です。viewDidLoadを次のように変更します...

-(void)viewDidLoad
{
    self.managedObjectContext = [[NSManagedObjectContext alloc] init];
    self.managedObjectContext.parentContext = self.book.managedObjectContext;
    // We are in the main thread, so we can safely access the main MOC
    // Basically, move our object pointer to book into our local MOC.
    NSError * error = nil;
    Book *book = [self.managedObjectContext existingObjectWithID:self.book.objectID error:&error];
    // handle nil return and/or error
    self.book = book;
    // Now, your access to book will be in the local MOC, and any changes
    // you make to the book or book.author will all be confined to the local MOC.
}

今、あなたがしなければならないのは電話することだけです

[self.managedObjectContext save:&error];

saveAndDismissアクションで。saveを呼び出さないと、変更は保存されず、すべて自動的に消えます。

編集

上記の「保存」は、オブジェクトの状態を親コンテキストに移動するだけであることに注意してください。したがって、「メイン」MOCには「子」からの変更が含まれていますが、変更はまだディスクに保存されていません。

于 2012-05-07T19:22:23.547 に答える