【发布时间】:2011-11-15 07:40:15
【问题描述】:
在处理复杂模型时,我遇到了 NSUndoManager 无法撤消的问题。
这是我的模型。
我有一个处理核心数据的单例,这是它的初始化:
model =[NSManagedObjectModel mergedModelFromBundles:nil];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSString *path = pathInDocumentDirectory(@"store.data");
NSURL *storeURL = [NSURL fileURLWithPath:path];
NSError *error = nil;
if(![psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:&error]) {
[NSException raise:@"Open failed" format:@"Reason: %@", [error localizedDescription]];
}
context = [[NSManagedObjectContext alloc] init];
NSUndoManager *contextUndoManager = [[NSUndoManager alloc] init];
[contextUndoManager setLevelsOfUndo:20];
[context setUndoManager:contextUndoManager];
[context setPersistentStoreCoordinator:psc];
对于每个实体,我都有一个调用 [self initWithEntity...] 的 init 方法,然后初始化一些属性。这是 HalfEdge 实体的一个示例:
- (id) initWithVertex:(Vertex*) vert inManagedObjectContext: context {
NSEntityDescription* tEntityDescription = [NSEntityDescription entityForName: @"HalfEdge"
inManagedObjectContext: context];
self = [self initWithEntity: tEntityDescription insertIntoManagedObjectContext: context];
if(self) {
self.lastVertex = vert;
[self.lastVertex addHalfEdgeObject:self];
}
return self;
}
当用户添加新绘图时,我会创建一个新的绘图实体,然后让用户在屏幕上添加点。对于每个点,都会执行一个可能添加和/或删除三角形实体、半边和顶点的规则。这是电话:
[[[DrawingsStore sharedStore].managedObjectContext undoManager] beginUndoGrouping];
[delaunay addPoint:CGPointMake(localizacion.x-dummy.bounds.size.width/2, localizacion.y-dummy.bounds.size.height/2)];
[[DrawingsStore sharedStore].managedObjectContext processPendingChanges];
[[[DrawingsStore sharedStore].managedObjectContext undoManager] endUndoGrouping];
如您所见,我为该规则中发生的所有事情设置了一个撤消组。
然后当按下按钮时,我正在调用 [[context undoManager] undo];但它什么也没做。
我在撤消之前和之后打印一个提取,它是相同的。我可以看到 rutine 工作正常,将所有正确的实体添加到核心数据中,但它根本不会撤消任何操作。
根据 Aderstedt 的建议进行编辑
好的,我删除了 NSManagedObject 子类的自定义 init 方法,并创建了一个这样的类方法:
+ (HalfEdge*) addWithVertex:(Vertex*) vert inManagedObjectContext: context {
HalfEdge* halfEdge = [NSEntityDescription insertNewObjectForEntityForName:@"HalfEdge" inManagedObjectContext:context];
if(halfEdge) {
halfEdge.lastVertex = vert;
[halfEdge.lastVertex addHalfEdgeObject:self];
}
return halfEdge;
}
结果还是一样。对象被创建,撤消不起作用。 (canUndo 返回 1)
编辑
哇,我刚刚注册了 undoManager 的 NSUndoManagerCheckpointNotification,一旦我点击撤消,它就会像循环一样被永久发布。好的,现在我知道我一定在某个地方做错了,但是……在哪里?
【问题讨论】:
标签: objective-c core-data