Note that there are some explanatory texts on larger screens.

plurals
  1. POAdding yourself as an observer to an array than an NSArrayController is bound to?
    primarykey
    data
    text
    <p>I have class called <code>AppController</code> which contains a mutable array of <code>Person</code> objects called <code>people</code>. Each person simply has an NSString and a float. </p> <p>I also have an <code>NSArrayController</code> whose <code>contentArray</code> is bound to the <code>people</code> array in AppController. Then I have the usual setup of a table view bound to the array controller to show a list of all the person objects.</p> <p>In my AppController class, I tried to register as an observer of the people array to add undo support. Here's how I do it:</p> <pre><code>@implementation AppController @synthesize people; - (id)init { self = [super init]; if (self != nil) { people = [[NSMutableArray alloc] init]; undoManager = [[NSUndoManager alloc] init]; [self addObserver:self forKeyPath:@"people" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL]; } return self; } - (void)undo:(id)sender { [undoManager undo]; } - (void)redo:(id)sender { [undoManager redo]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { int kindOfChange = [[change objectForKey:NSKeyValueChangeKindKey] intValue]; int index = [[change objectForKey:NSKeyValueChangeIndexesKey] firstIndex]; Person *p; if (kindOfChange == NSKeyValueChangeInsertion) { p = [change objectForKey:NSKeyValueChangeNewKey]; [[undoManager prepareWithInvocationTarget:self] removePersonAtIndex:index]; } else { p = [change objectForKey:NSKeyValueChangeOldKey]; [[undoManager prepareWithInvocationTarget:self] addPerson:p atIndex:index]; } } - (void)addPerson:(Person *)person atIndex:(int)index { [[self mutableArrayValueForKey:@"people"] addObject:person]; } - (void)removePersonAtIndex:(int)index { [[self mutableArrayValueForKey:@"people"] removeObjectAtIndex:index]; } @end </code></pre> <p>With this code, I can successfully add a person object and then undo it. I cannot, however, undo deleting a person object. I always get this exception when I undo a delete operation:</p> <pre><code>[&lt;NSCFArray 0x3009a0&gt; addObserver:forKeyPath:options:context:] is not supported. Key path: personName </code></pre> <p>It seems like I'm not the only one, though: <a href="http://www.cocoabuilder.com/archive/cocoa/84489-modifying-the-array-of-an-nsarraycontroller.html#84496" rel="nofollow noreferrer">http://www.cocoabuilder.com/archive/cocoa/84489-modifying-the-array-of-an-nsarraycontroller.html#84496</a></p> <p>Any ideas?</p> <p>UPDATE:</p> <p>Here's the backtrace:</p> <pre><code>#0 0x7fff8161b41e in -[NSArray(NSKeyValueObserverRegistration) addObserver:forKeyPath:options:context:] #1 0x7fff8822fc47 in -[_NSModelObservingTracker _registerOrUnregister:observerNotificationsForModelObject:] #2 0x7fff883b2bb9 in -[_NSModelObservingTracker startObservingModelObjectAtReferenceIndex:] #3 0x7fff883acc41 in -[_NSModelObservingTracker setObservingToModelObjectsRange:] #4 0x7fff883aca5a in -[NSTableBinder tableView:updateVisibleRowInformation:] #5 0x7fff883ac98e in -[_NSBindingAdaptor tableView:updateVisibleRowInformation:] #6 0x7fff882b4c7b in -[NSTableView drawRect:] #7 0x7fff882ab081 in -[NSView _drawRect:clip:] #8 0x7fff882a9cf4 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] #9 0x7fff882aa05e in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] #10 0x7fff882aa05e in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] #11 0x7fff882a83c6 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] #12 0x7fff882a9292 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] #13 0x7fff882a9292 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] #14 0x7fff882a7ee8 in -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] #15 0x7fff882a479a in -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] #16 0x7fff8821dff6 in -[NSView displayIfNeeded] #17 0x7fff88218ea2 in _handleWindowNeedsDisplay #18 0x7fff81da9077 in __CFRunLoopDoObservers #19 0x7fff81d84ef4 in __CFRunLoopRun #20 0x7fff81d8484f in CFRunLoopRunSpecific #21 0x7fff8836ab31 in _NSUnhighlightCarbonMenu #22 0x7fff8834d0c1 in -[NSMenu performKeyEquivalent:] #23 0x7fff8834be69 in -[NSApplication _handleKeyEquivalent:] #24 0x7fff8821caa1 in -[NSApplication sendEvent:] #25 0x7fff881b3922 in -[NSApplication run] #26 0x7fff881ac5f8 in NSApplicationMain #27 0x100001469 in main at main.m:13 </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload