NSArrayController和键值编码

时间:2011-03-13 13:55:31

标签: objective-c macos

我正在尝试填充基于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

2 个答案:

答案 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: