次のアクセサー メソッドを使用して、NSArrayController (thingsController) の addObject メソッドをインターセプトしようとしています。
- (void)insertObject:(Thing *)thing
inThingsAtIndex:(NSUInteger)index;
Thing と MyDocument の 2 つのクラスがあります。Thing には name という 1 つのプロパティがあります。MyDocument には、things という名前の NSMutableArray と、thingsController という名前の NSArrayController があります。NIB では、File's Owner が MyDocument に設定され、NSArrayController の content 配列が File's Owner にバインドされ、モデル パスが things に設定されています。NSArrayController には、モードが Class に設定され、Class Name が Thing に設定されており、name という 1 つのキーがあります。MyDocument には createThing というメソッドがあります。このメソッドは最初に thingsController newObject を送信し、次に addObject を送信します。Thing の init メソッドにブレークポイントを設定すると、thingsController が newObject に送信されたときに呼び出されます。ただし、thingsController が addObject に送信されると、アクセサー メソッドの insertObject:(Thing *)thing inThingsAtIndex:(NSUInteger)index は呼び出されません。
Key-Value Coding Accessor Methods に関する 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];
}