2

A と B の 2 つのエンティティがあります。A は B と 1 対多のリレーションシップを持っています。B のいくつかのプロパティを変更した後、B のすべての変更を元に戻すにはどうすればよいですか? ロールバック方法を試しましたが、それは A の他のプロパティに影響します。

4

1 に答える 1

1

disableUndoRegistrationA に変更を加える直前に undoManager を呼び出し、A に変更を加えた直後に呼び出してみてくださいenableUndoRegistration

さて、このコードをどこに置くか?理想的には、A クラスの NSManagedObject のいくつかのメソッドをオーバーライドしますが、どのメソッドをオーバーライドしますか? validateメソッドが呼び出されるまでに undoManager に変更が既に登録されている可能性があるため、少なくとも元に戻す登録を無効にする方法は機能しないと思います。使いたくなりますwill/didChangeValueForKey:が、クラス リファレンスには「このメソッドをオーバーライドしてはいけません」と書かれています。

したがって、Aに影響を与える可能性のあるインターフェースアクションでこれに対処するのに苦労していると思います.


編集 -- リクエストしたサンプルは次のとおりです。

- (IBAction) someAction:(id)sender {
    BOOL isA = NO;
    NSManagedObjectContext currentContext = nil;
    if ([[sender objectControlledBySender] isKindOfClass:[subclassedManagedObjectA class]]) {
        isA = YES;
        currentContext = // get a ref to your current context, or just make it an unretained property of this controller's class
        [currentContext.undoManager disableUndoRegistration];
    }
    // Make the changes to the object accessed via sender.
    if (isA)
        [currentContext.undoManager enbleUndoRegistration];
}

「objectControlledBySender」は、sender表示、編集、または選択するオブジェクトへのあらゆる種類のアクセサーを使用して、あらゆる種類のコントロールによって可能になるため、必然的にあいまいです。

于 2012-04-30T11:28:08.370 に答える