我正在尝试填充基于NSTableView
的文档,并使用NSArrayController
对其进行控制。我想我理解Key Value coding的概念。但是,我担心NSArrayController
不尊重Accessor Search Pattern for Ordered Collections。让我解释一下
我有一个名为Student Student的班级
#import <Cocoa/Cocoa.h>
@interface Student : NSObject {
NSString* studentName;
float marks;
}
//Accessor and mutators
@property (readwrite, copy) NSString* studentName;
@property (readwrite) float marks;
//Initializer - Init all resources
-(id) init;
//Dealloc - Release resources
-(void) dealloc;
@end
实施
#import "Student.h"
@implementation Student
//Synthesize the accessors
@synthesize studentName;
@synthesize marks;
//Initializer - Init all resources
-(id) init
{
self = [super init];
if(self){
studentName = @"New Student";
marks = 0.0;
}
return self;
}
//Dealloc - Release resources
-(void) dealloc
{
[studentName release];
[super dealloc];
}
@end
MyDocument类定义如下,其中包含NSMutableArray
类型的即时变量
#import <Cocoa/Cocoa.h>
@class Student;
@interface MyDocument : NSDocument
{
NSMutableArray* students;
}
//Initializers
-(id) init;
//Deallocators
-(void) dealloc;
//Creating the proxy object
-(id) mutableArrayValueForKey:(NSString *)key;
//Array controller uses keyvalue
//coding to call this
-(void) insertObject:(Student*) s inStudentsAtIndex:(int) index;
@end
在IB中,Array Controller的属性设置为Student对象,其实例变量被添加到键中。在绑定部分中,Content Array绑定到文件所有者,它是MyDocument类的实例。模型键路径设置为数组名称students
这是MyDocument的实现
#import "MyDocument.h"
#import "Student.h"
@implementation MyDocument
- (id)init
{
self = [super init];
if (self) {
students = [[NSMutableArray alloc] init];
}
return self;
}
-(void) dealloc
{
[students release];
[super dealloc];
}
//Array controller uses keyvalue
//coding to call this
-(void) insertObject:(Student*) s inStudentsAtIndex:(int) index
{
NSLog(@"Insert object is called");
}
//Creating the proxy object
-(id) mutableArrayValueForKey:(NSString *)key
{
NSLog(@"Checking if NSArrayController is trying to create a proxy %@",key);
return students;
}
永远不会调用我的问题-(void) insertObject:(Student*) s inStudentsAtIndex:(int) index
。但是,如果我实现了一个函数名-(void) setStudents:(Student*)s
,那就调用它。 - (id) mutableArrayValueForKey:(NSString *)key
仅用于调试目的;我想看到Key Value编码的某些部分正在运行。无论是否有(id) mutableArrayValueForKey:(NSString *)key
我错过了什么?我在Mac 10.6.6上使用XCode 3.2.5
答案 0 :(得分:1)
根据您的说法,我不确定何时会调用insertObject:
。在IB中,您将数组控制器绑定到NSMutableArray
,因此它对您的MyDocument
类一无所知。
如果您想要将新学生添加到阵列的某种通知,您需要自己挂钩。一种方法是自己处理来自UI的操作(例如,如果你有一个New按钮),并在该处理程序中将对象添加到数组中,并执行其他任何需要的逻辑。
答案 1 :(得分:1)
请阅读here中有序收藏的访问者搜索模式部分。引用句子
搜索接收者的类a 一对名称与之匹配的方法 模式
-insertObject:in<Key>AtIndex:
和 -removeObjectFrom<Key>AtIndex:
(对应于NSMutableArray 原始方法insertObject:atIndex:
和 removeObjectAtIndex:分别),或 匹配模式的方法-insert<Key>:atIndexes:
和-remove<Key>AtIndexes:
(对应于。{1}}NSMutableArrayinsertObjects:atIndexes:
和removeObjectsAtIndexes:
方法)。
所以你必须实施 PAIR 。您的课程应同时实施 - removeObjectFrom<Key>AtIndex:
和insertObject:in<Key>AtIndex: