當使用複雜模型時,NSUndoManager無法撤消。NSUndoManager撤消不能在iOS上使用核心數據
這是我的模特。
我有一個Singleton,它利用核心數據的東西照顧,這是它的初始化:
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];
因爲我有一個調用[自我initWithEntity的init方法每個實體... ]然後進入一些屬性。這是半邊實體的例子:
- (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;
}
當用戶添加了一個新的繪圖創建一個新的繪圖實體,然後讓用戶添加點錄音屏幕。對於每個點,rutine都會執行,可能會添加和/或刪除三角形實體,半邊和頂點。這是電話:
[[[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];
正如你所看到的,我設置了一個撤消組裏面發生的所有事情。
然後當按下按鈕時,我正在調用[[上下文撤銷管理器]撤銷];但它什麼都不做。
我在撤消之前和之後打印一個提取,它是相同的。我可以看到rutine正在正常工作,將所有正確的實體添加到核心數據中,但是它根本不會撤消任何操作。
編輯與sugestions從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,一旦我點擊撤消它被張貼永遠像一個循環。好吧,現在我知道我一定在某個地方做錯了什麼,但是......在哪裏?
感謝您的回覆。我會嘗試你所說的。 但我沒有閱讀文檔關於繼承NSManagedObject,並且你可以看到,我沒有真正覆蓋initWithEntity ......我知道這似乎並沒有太正確做到這一點,但我看到它的地方,它實際上似乎工作,正如我所說的實體正在創建並添加到核心數據庫。 至於awakeFromInsert ...有沒有辦法將這些參數傳遞給初始值設定項? – Odrakir
'-insertNewObjectForEntityForName'返回插入的對象,您可以使用它來設置一些初始參數。 – Aderstedt
我編輯了你採取的方式(見上文)。仍然沒有撤消。 – Odrakir