为什么NSArrayController不通过绑定调用访问器方法?

时间:2010-06-25 20:35:48

标签: objective-c cocoa-bindings nsarraycontroller

我试图使用以下访问器方法拦截NSArrayController(thingsController)addObject方法。

- (void)insertObject:(Thing *)thing
 inThingsAtIndex:(NSUInteger)index;

我有两个类:Thing和MyDocument。东西有一个属性:名字。 MyDocument有一个名为things的NSMutableArray和一个名为thingsController的NSArrayController。在NIB中,File的Owner设置为MyDocument,我将NSArrayController的内容数组绑定到File的Owner并将模型路径设置为thing。 NSArrayController的模式设置为Class,Class Name设置为Thing,它有一个名为name的键。在MyDocument中,我有一个名为createThing的方法,它首先发送thingsController newObject,然后将其发送给addObject。如果我在Thing的init方法中设置断点,那么当thingController发送newObject时会调用它。但是,当thingController发送addObject时,我的访问器方法insertObject :( Thing *)thing inThingsAtIndex:(NSUInteger)索引未被调用。

我已经阅读了Apple关于键值编码访问器方法的文档,我认为我是合规的,但是,我必须遗漏一些东西。

非常感谢任何帮助。

以下代码......

Thing.h

#import <Cocoa/Cocoa.h>


@interface Thing : NSObject {
NSString *name;

}
@property (readwrite, copy) NSString *name;

@end

Thing.m

#import "Thing.h"


@implementation Thing

@synthesize name;

-(id) init
{
[super init];

name = @"Default";

return self;
} 

@end

MyDocument.h

#import <Cocoa/Cocoa.h>
@class Thing;

@interface MyDocument : NSDocument
{
NSMutableArray *things;
IBOutlet NSArrayController *thingsController;
IBOutlet NSTableView *tableView;
}


- (IBAction)createThing:(id)sender;

- (void)insertObject:(Thing *)thing
 inThingsAtIndex:(NSUInteger)index;

- (void)removeObjectFromThingsAtIndex:(NSUInteger)idx;


@end

MyDocument.m

- (IBAction)createThing:(id)sender
{
//Create the object
Thing *t = [thingsController newObject];

//Add it to the content array of 'thingsController'
[thingsController addObject:t];

NSLog(@"The new content of array is%@",things);

[t release];
}

1 个答案:

答案 0 :(得分:1)

道歉。我做了一个改变,它现在有效。我以为我过去曾经尝试过这种做法而且没有用过......

我添加了

@property (readwrite, copy) NSMutableArray *things;

到MyDocument.h

@synthesize things;

到MyDocument.m。

似乎正在发挥作用。

问候。