我有一个名为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
有什么想法吗?
更新:
这是回溯:
[<NSCFArray 0x3009a0> addObserver:forKeyPath:options:context:] is not supported. Key path: personName
答案 0 :(得分:4)
正在发生的事情是[change objectForKey: NSKeyValueChangeNewKey]
返回NSArray *
,而不是Person *
。您应该在返回的数组上调用-lastObject
以获取实际的Person对象(假设该数组只包含一个对象)。