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 (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to