2010-08-15 46 views
0

NSPersistentDocument Core Data Tutorial執行情況概述部分,它說:關於產品NSWindowController和NSPersistentDocument核心數據教程

  1. ...
  2. 在筆尖文件中創建新的頂層對象的一個​​問題是,當您使用綁定時,對象會保留其綁定的其他對象。這意味着綁定必須被打破,以確保文檔關閉時沒有保留週期。而且,由於新控制器擁有的nib文件包含頂層對象,並且控制器的類不會從NSWindowController繼承,所以您需要在窗口關閉時釋放頂層對象。

爲什麼不只是讓控制器繼承自NSWindowController?有沒有理由不起作用?或者這只是一個風格問題?

回答

1

正如下面的評論,我沒有得到這個與NSWindowController子類一起工作,它似乎保存了很多代碼。

這裏是我的子標題:

#import <Cocoa/Cocoa.h> 

@interface NewAccountSheetController : NSWindowController { 
@private 
    BOOL isValidForInsert; 
    NSManagedObjectContext * managedObjectContext; 
    NSObjectController * objectController; 
    NSObjectController * targetController; 
} 

@property (setter=setValidForInsert:) BOOL isValidForInsert; 
@property (nonatomic, retain) IBOutlet NSManagedObjectContext * managedObjectContext; 
@property (nonatomic, retain) IBOutlet NSObjectController * objectController; 
@property (nonatomic, retain) IBOutlet NSObjectController * targetController; 

- (void)beginSheetForWindow:(NSWindow *)window; 

- (IBAction)endSheet:(id)sender; 

@end 

這裏是一個Pastebin實施。

我不知道如何描述所需的綁定等,但如果你熟悉上面的教程,他們應該直接推斷......我想。 :-)

0

在這個例子中,它討論控制工作表而不是窗口。一張表在技術上是一個窗口組件,而不是一個窗口本身,所以它不能使用NSWindowController子類作爲控制器。窗口控制器不知道如何處理另一個窗口擁有的窗口。

上面的文字只是提醒你,雖然表控制器看起來非常像一個窗口控制器,但它不是一個,而且你必須手動處理由窗口控制器自動處理的釋放。

+0

這個答案聽起來非常合理,但實際上在我得到它之前,我繼續前進並嘗試......不僅子類化NSWindowController工作,它還節省了相當多的代碼!看起來這不是一種風格的東西,就是在編寫這個例子後的某段時間纔開始工作。 – 2010-08-16 01:13:13

+0

我認爲你可能遇到的問題是窗口控制器自動響應比表單所需要的範圍更廣的事件。窗口控制器假定它控制一個獨立的窗口。我會在釋放之前進行徹底測試,以確保表格不像窗口的行爲,例如沒有過渡關閉。 – TechZen 2010-08-16 12:42:31

+0

總是很好的建議!我將確保在發佈前徹底測試。 – 2010-08-16 18:07:59