2009-12-29 45 views
2

我已經經歷了一堆Core Data示例和Apple文檔。在完成這一整天的工作後,我在牆上。可可綁定:NSObjectController不是KVC兼容的代表對象屬性

我想要發生的一切是我在文本字段中輸入一些文本,保存文件,再次打開並查看文本。

我做了一個非常簡單的基於Core Data文檔的應用程序進行實驗。這裏是詳細信息:

1)數據模型有一個實體(「注」)與一個屬性(「標題」),這是一個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對象拖到名爲「Note Object Controller」的Interface Builder文檔窗口中。我將模式設置爲「實體」,將實體名稱設置爲「註釋」。 「準備內容」和「可編輯」被選中。 (所有的例子,我已經做了,並能夠找到在這裏使用NSArrayController。我不需要一個數組控制器的權利?我希望能夠打開同一個應用程序的多個窗口,但我仍然不認爲我需要一個數組控制器?所有的例子都有一個NSTableView和一個添加按鈕,因爲我沒有NSTableView,所以不需要添加按鈕。

3)值NSTextView綁定我已綁定到「註釋對象控制器」與代表對象的控制器鍵和標題的模型關鍵路徑。

當我運行我的應用程序,我得到

[<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. 

我在做什麼錯?我想輸入文本字段,保存文件,再次打開並查看文本。

回答

4
[<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. 

我在做什麼錯?

錯誤消息告訴你你做錯了什麼:你試圖綁定到你的對象控制器的representedObject屬性,但它沒有。綁定到不存在的屬性無法工作。

注意是NSObjectController的內容對象,所以這是您需要綁定到的控制器鍵:content

+0

好的,所以我有許多Core Data教程使用NSArrayController和arrangedObjects(沒有使用NSObjectController)。我假設如果我回來並完全理解綁定在這些示例中的工作方式,然後使用NSObjectController和內容來應用這些知識,我應該讓它工作。 如果那是真的,我還有一個問題。 NSArrayController示例調用add:選擇器(當在表中創建新行時)。是否有NSObjectController所需的等價物? 謝謝 – Mark 2009-12-29 04:17:30

+0

關鍵要注意的是,在IB中,控制器鍵和模型鍵路徑是分開的。這是有原因的:第一個鍵(Controller Key)訪問控制器的某些屬性,其值是模型的一部分;關鍵路徑的其餘部分(模型關鍵路徑)向下鑽入模型中以訪問更多基本對象,例如字符串和圖像以供視圖顯示。這是Cocoa在您的應用程序中預期並實施MVC分離的許多方法之一。 – 2009-12-29 04:38:28

+0

你應該把'add:'作爲一個單獨的問題,因爲它與這個問題無關。 – 2009-12-29 04:39:58