On 19 Dec 2009, at 11:39, Graham Cox wrote:

> 
> On 19/12/2009, at 12:08 PM, Gerriet M. Denkmann wrote:
> 
>> How would I do this?
>> Subclass the NSArrayControllers and overrriding add: and remove: to call 
>> setActionName:?
>> Or is there a simpler way?
> 
> 
> My take on this is this: The action name is part of the View layer (because 
> it appears in the menu) but the add/remove are themselves part of the data 
> model. So the action name is best set also by the controller that triggers 
> the add/remove events in the data model.
> 
> The typical pattern I use is this:
> 
> - (IBAction) someAction:(id) sender
> {
>    [myDataModel doSomethingUndoable];  // calls through to data model's -add: 
> method which registers -remove: with the undo manager
>    [[self undoManager] setActionName:[sender title]];
> }
> 

Following your suggestion I added in MyDocument.m:

- (IBAction)add: sender;
{
        [ [ self undoManager ] setActionName: @"Add" ]; 
        [ dictWordArrayController add: sender ];
}

and now got two Undo items:
1. Undo Add (which does nothing)
2. Undo (without name, which undoes the add:)

Same result for subclassing NSArrayController and overriding add:

The documentation says: "Beginning with Mac OS X v10.4 the result of this 
method is deferred until the next iteration of the runloop"

Setting a breakpoint on registerUndoWithTarget:selector:object: tell me that 
this is triggered by some internal method in NSArrayController.

Now I don't have any more ideas how to set undo-names.

I had a little more success with my TableViews:
Setting the ActionName in the delegate method -controlTextDidEndEditing: works 
- somehow.
The problem: this method is called regardless whether some change did occur or 
not.
So if one double clicks a cell, then clicks somewhere else (or edits the 
content of the cell from "A" to "B" and back to "A" ) I get an empty "Undo Edit 
LastName".

Setting a flag in controlTextDidChange: is no real help, because it does not 
cover the A → B → A case.

Without interfering with setActionName: one never gets empty undos.

Maybe GCUndoManager could implement:
- (void)setActionNameToBeUsedAtTheNextNonEmptyNamelessUndo: (NSString 
*)actionName;
- or something like that with a slightly shorter name.


Kind regards,

Gerriet.

_______________________________________________

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