将自己作为观察者添加到数组而不是NSArrayController绑定到?

时间:2010-08-08 21:42:42

标签: objective-c cocoa xcode cocoa-bindings appkit

我有一个名为AppController的类,它包含一个名为Person的{​​{1}}对象的可变数组。每个人只有一个NSString和一个浮点数。

我还有一个people,其NSArrayController绑定到AppController中的contentArray数组。然后我通常设置一个绑定到数组控制器的表视图,以显示所有人物对象的列表。

在我的AppController类中,我尝试注册为people数组的观察者以添加撤消支持。我是这样做的:

people

使用此代码,我可以成功添加人物对象然后将其撤消。但是,我无法撤消删除人物对象。撤消删除操作时,我总是遇到此异常:

@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

似乎我不是唯一一个,http://www.cocoabuilder.com/archive/cocoa/84489-modifying-the-array-of-an-nsarraycontroller.html#84496

有什么想法吗?

更新:

这是回溯:

[<NSCFArray 0x3009a0> addObserver:forKeyPath:options:context:] is not supported.  Key path: personName

1 个答案:

答案 0 :(得分:4)

正在发生的事情是[change objectForKey: NSKeyValueChangeNewKey]返回NSArray *,而不是Person *。您应该在返回的数组上调用-lastObject以获取实际的Person对象(假设该数组只包含一个对象)。