Я прошел через кучу примеров данных ядра и документации Apple. Я нахожусь у стены после работы над этим весь день.Cocoa Bindings: NSObjectController не соответствует KVC для свойства представленного объекта
Все, что я хочу, это ввести текст в текстовое поле, сохранить файл, открыть его снова и увидеть там текст.
Я сделал очень простое приложение на основе данных Core Data для эксперимента. Вот данные:
1) Модель данных имеет один объект («Примечание») с одним атрибутом («title»), который является NSString.
2) Я создал контроллер вида «ManagingViewController», который загружается в виде под названием «NoteView» в поле MyDocument.xib без проблем. NoteView.nib имеет только один NSTextField.
ManagingViewController.h
#import <Cocoa/Cocoa.h>
#import "Note.h"
@interface ManagingViewController : NSViewController {
NSManagedObjectContext *managedObjectContext;
IBOutlet NSTextField *title;
}
@property (retain) NSManagedObjectContext *managedObjectContext;
@property (retain, readwrite) NSTextField *title;
@end
и ManagingViewController.m
#import "ManagingViewController.h"
#import "Note.h"
@implementation ManagingViewController
@synthesize managedObjectContext;
@synthesize title;
- (id)init
{
if (![super initWithNibName:@"NoteView" bundle:nil]) {
return nil;
}
return self;
}
@end
У меня есть NSManagedObject называется "Note.h"
#import <CoreData/CoreData.h>
#import "ManagingViewController.h"
@interface Note : NSManagedObject
{
}
@property (nonatomic, retain) NSString * title;
@end
и файл .m:
#import "Note.h"
#import "ManagingViewController.h"
@implementation Note
@dynamic title;
@end
В NoteView.nib мой:
1) владелец файла является ManagingViewController и IBOutlets в текстовое поле и вид связаны.
2) Я перетащил объект NSObjectController в окно документа Interface Builder под названием «Note Object Controller». Я установил режим на «Entity» и «Entity Name» на «Note». «Готовые материалы» и «Редактируемые» отмечены. (Все примеры, которые я сделал, и были в состоянии найти использование NSArrayController здесь. Мне не нужен контроллер массива правильно? Я хочу иметь возможность открывать несколько окон для одного и того же приложения, но я все еще не думаю, что я нужен массивный контроллер? На всех примерах есть кнопка NSTableView и кнопка добавления. Здесь нет необходимости в кнопке добавления, так как у меня нет NSTableView).
3) Связи NSTextView для значения. Я привязал его к «Note Object Controller» с помощью ключа контроллера представленного объекта Object и ключа ключа ключа заголовка.
Когда я запускаю мое приложение я получаю
[<NSObjectController 0x20004c200> addObserver:<NSTextValueBinder 0x20009eee0>
forKeyPath:@"representedObject.title" options:0x0 context:0x20009f380] was
sent to an object that is not KVC-compliant for the "representedObject" property.
Что я делаю неправильно? Я хочу ввести текстовое поле, сохранить файл, открыть его снова и увидеть там текст.
ОК, поэтому у меня есть ряд учебников по основным данным, которые используют NSArrayController и builtObjects (никто не использует NSObjectController). Я предполагаю, что если я вернусь и полностью пойму, как привязки работают в этих примерах, а затем применяйте эти знания, используя NSObjectController и контент, я должен работать. Если это правда, у меня есть еще один вопрос. Примеры NSArrayController называют add: selector (при создании новой строки в таблице). Есть ли эквивалент, необходимый для NSObjectController? Спасибо – Mark
Главное, чтобы заметить, что в IB ключ контроллера и ключ ключа модели являются отдельными. Для этого есть причина: первый ключ (ключ контроллера) обращается к некоторому свойству контроллера, значение которого является частью вашей модели; остальная часть ключевого пути (путь ключа модели) сводится к модели для доступа к более основным объектам, таким как строки и изображения для отображения. Это один из многих способов, с помощью которых Cocoa ожидает и обеспечивает разделение MVC в вашем приложении. –
Вы должны задать вопрос 'add:' как отдельный вопрос, так как он не имеет отношения к этому вопросу. –