4

アプリに元に戻す/やり直しメカニズムを実装しています。これは、多くの場合にうまく機能します。ただし、過去の deleteObject: を元に戻すことはできません。オブジェクトは元に戻すキューに正しく保存されており、元に戻すを呼び出すと、元に戻って Core Data スタックに再挿入されます。問題は、削除するとすべての属性が nil に設定されることです。

「グラフィックス」と呼ばれる対多の関係を持つエンティティ「キャンバス」があり、その逆が「キャンバス」に設定されています。グラフィックを削除してから挿入し直しても機能しません。コードは次のとおりです (redo メソッドは基本的に同じです)。

- (void)deleteGraphic:(id)aGraphic {
 //NSLog(@"undo drawing");
 //Prepare the undo/redo
 [self.undoManager beginUndoGrouping];
 [self.undoManager setActionName:@"Delete Graphic"];

 [[self.detailItem valueForKey:@"graphics"] removeObject:aGraphic];
 [[self managedObjectContext] deleteObject:aGraphic];

 //End undo/redo
 [self.undoManager registerUndoWithTarget:self selector:@selector(insertGraphic:) object:aGraphic];
 [self.undoManager endUndoGrouping];

 NSLog(@"graphics are %@", [self sortedGraphics]);

 //Update drawing
 [self.quartzView setNeedsDisplay];
}

そして、ここに奇妙さがあります:

削除前:

graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: {
canvas = 0x162b70 <x-coredata://A919979E-75AD-474D-9561-E0E8F3388718/Canvas/p20>;
content = <62706c69 73743030 d4010203 04050609 0a582476 65727369 6f6e5424 746f7059 24617263 68697665 7258246f 626a6563 7473>;
frameRect = nil;
label = nil;
order = 1;
path = "(...not nil..)";
traits = "(...not nil..)";
type = Path;
})

やり直し後:

graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: {
canvas = nil;
content = nil;
frameRect = nil;
label = nil;
order = 0;
path = nil;
traits = nil;
type = nil;
}),

コア データによって完全に無色化されただけで、同じオブジェクトであることがわかります。テストで「アクションなし」に設定したため、関係の削除ルールは明らかに関係がありません。

4

1 に答える 1

2

まあ、私は修正に満足していませんが、1つの方法は、オブジェクトを削除する前にコンテキストで[mocsave]を実行することです。残念ながら、元に戻す/やり直しの状況では、これはすべての操作の後に保存する必要があることを意味します。これは最適ではありませんが、この問題を修正します。

于 2010-06-03T21:38:23.077 に答える