NSArrayController и кодирование значения ключа - PullRequest
1 голос
/ 13 марта 2011

Я пытаюсь заполнить документ на основе 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

Ответы [ 2 ]

1 голос
/ 19 марта 2011

Пожалуйста, прочитайте раздел Шаблон поиска аксессуаров для упорядоченных коллекций в здесь .Цитируя предложение

В классе получателя ищется пара методов, имена которых соответствуют шаблонам -insertObject:in<Key>AtIndex: и - removeObjectFrom<Key>AtIndex: (соответствующие примитивным методам NSMutableArray insertObject:atIndex: и removeObjectAtIndex: соответственно)или методы, соответствующие шаблону -insert<Key>:atIndexes: и -remove<Key>AtIndexes: (соответствующие методам NSMutableArrayinsertObjects:atIndexes: и removeObjectsAtIndexes:).

Таким образом, вы должны реализовать PAIR .Ваш класс должен реализовать оба - removeObjectFrom<Key>AtIndex: и insertObject:in<Key>AtIndex:

1 голос
/ 13 марта 2011

Исходя из того, что вы сказали, я не уверен, когда будет звонить insertObject:.В IB вы привязываете контроллер массива к вашему NSMutableArray, поэтому он ничего не знает о вашем MyDocument классе.

Если вы хотите, чтобы какое-то уведомление о том, когда новый студент добавляется в вашмассив, вам нужно подключить это самостоятельно.Один из способов сделать это - самостоятельно обработать действие из пользовательского интерфейса (например, если у вас есть кнопка New), и в этом обработчике добавить объект в ваш массив и выполнить любую другую логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...