Subject: Re: KVO Code Breaks Undo



On Mar 28, 2009, at 7:33 AM, Richard Somers wrote:

I have core data document based application with a custom opengl layer-hosting view. Everything works except when objects are added or removed from the managed object model the view is not redrawn. So I add the following to code to redraw the view but then automatic undo is broken.

// Receive KVO change notifications if objects are added to or removed
// from the array so we can redraw the display. !!!: Breaks undo!
- (void)awakeFromNib
{
[observableController addObserver:self forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionNew context:NULL];
}


// Respond to KVO change notifications. !!!: Breaks undo!
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject: (id)object change:(NSDictionary *)change context:(void *)context
{
[graphicsLayer setNeedsDisplay];
}

Any ideas as to why undo stopped working?

You have implemented observeValueForKeyPath:... incorrectly. The main issue is that you fail to invoke super's implementation, but you are not using a context to distinguish your observation request from any observation request made by your superclass(es).

Try this: on a blank line outside of any method, type "observe" and then ask Xcode to complete the line. From the possible completions, select 'observeValueForKeyPath - observeValueForKeyPath: definition'. That will insert a template for the canonical implementation of observeValueForKeyPath:... into your code. Follow that template and you should do better.

You might also consider the approach outlined here:
http://www.mikeash.com/?page=pyblog/key-value-observing-done-right.html

Cheers,
Ken

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@xxxxxxxxxxxxxxx)

Pl...

ease 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/maillists%40codeha.us

This email sent to maillists@xxxxxxxxx



Privacy