Re: CoreData and undo/redo : how to add a managed object with attributes already set in the undo/redo stack ?
Re: CoreData and undo/redo : how to add a managed object with attributes already set in the undo/redo stack ?
- Subject: Re: CoreData and undo/redo : how to add a managed object with attributes already set in the undo/redo stack ?
- From: Guillaume Laurent <email@hidden>
- Date: Fri, 9 Jul 2010 00:10:27 +0200
On Jun 27, 2010, at 4:08 , Jerry Krinock wrote:
>
> On 2010 Jun 26, at 16:01, Guillaume Laurent wrote:
>
>> I'm having difficulties with the undo/redo mechanism and my Core Data objects.
>
> Uh-huh.
>
>> The problem is that I create a CoreData object (say a rectangle), then set some of its attributes according to some controls values (the position and size of a CALayer the user has just created in a view). This set of actions is a single one from the user's point of view. I know I can make it appear so with NSUndoManager:beginUndoGrouping/endUndoGrouping. But when I undo this in the app, each of the steps of the object's creation are undone seperately, including the setting of each of the attributes. ....
>
>> Bottom line : is there a way to make it so that the CoreData object's instantiation and its setup are registered as a single action in the undo/redo stack ?
>
> I presume that you are setting these attributes in -awakeFromInsert. One solution I've seen used for this particular problem is to disable undo registration when the attributes are set. Something like this:
>
> - (void)awakeFromInsert {
> [super awakeFromInsert] ;
>
> // Close the curtain so the wizard can do some magic
> [[self managedObjectContext] processPendingChanges] ;
> [[[self managedObjectContext] undoManager] disableUndoRegistration] ;
>
> // Do some magic
> [self setFoo:whatever] ;
> [self setBar:whateverElse] ;
>
> // Re-open the curtain
> [[self managedObjectContext] processPendingChanges] ;
> [[[self managedObjectContext] undoManager] enableUndoRegistration] ;
> }
>
> So the setting of foo and bar aren't even on the undo stack. But when you Undo, it removes the object, so no one cares.
Yes, that's what I did, but a friend gave me a better one, which was to dissociate element creation and insertion :
NSEntityDescription* segmentEntity = [NSEntityDescription entityForName:@"Segment" inManagedObjectContext:managedObjectContext];
NSManagedObject<Segment>* newSegment = [[NSManagedObject alloc] initWithEntity:segmentEntity insertIntoManagedObjectContext:nil];
// do some init stuff on newSegment
[managedObjectContext insertObject:newSegment];
That does exactly what I need.
--
Guillaume
http://telegraph-road.org
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden