2010-08-15 63 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