Я пытаюсь заполнить документ на основе NSTableView
и управлять им с помощью NSArrayController
. Полагаю, я понял концепции кодирования Key Value . Однако я боюсь, что NSArrayController
не соблюдает шаблон поиска аксессоров для упорядоченных коллекций . Позвольте мне объяснить
У меня есть имя ученика, как определено
#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 атрибуты контроллера массива установлены на объект Student, а его переменные экземпляра добавляются к ключу. В разделе связывания массив содержимого связан с владельцем файла, который является экземпляром класса 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