• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: CoreData and undo/redo : how to add a managed object with attributes already set in the undo/redo stack ?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

  • Prev by Date: Re: CoreData and undo/redo : how to add a managed object with attributes already set in the undo/redo stack ?
  • Next by Date: Pipelining HTTP Requests?
  • Previous by thread: Re: CoreData and undo/redo : how to add a managed object with attributes already set in the undo/redo stack ?
  • Next by thread: how to set custom icon folder to invisible?
  • Index(es):
    • Date
    • Thread