我正在开发第一个基于Mac文档的应用程序。

我有NSDocument的子类,重新实现的方法如

- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError;
- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError;
- (void)makeWindowControllers;

主窗口 Controller 是NSWindowsController的子类,它包含两个NSViewController子类。

我面临的问题是我需要从这些 View Controller 访问当前文档。我在叫什么
MyDocument *myDocument = [[NSDocumentController sharedController] currentDocument];

首先,在启动应用程序之后,立即创建一个新文档。然后,创建了主窗口及其 View Controller ,但是上面的方法返回nil。这是我得到的日志(使用NSLog):
Just created this new document: <MyDocument: 0x10040ff10>
I'm in a view controller and current document is (null)

之后,创建一个新文档并调用此方法将导致非零指针,但它并不指向正确的文档,而是指向第一个:
Just created this new document: <MyDocument: 0x100437e10>
I'm in a view controller and current document is <MyDocument: 0x10040ff10>

请注意,在创建第二个文档之后,currentDocument指向第一个文档,而不指向第二个文档。

对我在这里遗失或做错的事情有任何想法吗?何时将currentDocument设置为NSDocumentController

最佳答案

(我将前面的答案留在原处,因为当要求提供NSView的子类时它会回答问题,但是现在原始的发帖人说他正在使用NSViewController,因此有不同的注意事项)。

对于NSViewController控制的 View ,应使用NSViewController属性将representedObject附加到其数据。该抽象旨在由NSViewController的包含 Controller 进行管理,听起来像是NSWindowController

根据要提供/需要提供多少封装,您可以将文档推送到NSViewController(如果它们对整个文档进行操作),也可以仅推送文档中与特定NSViewController有密切关系的信息。

例如,我假设有一个软件可以编辑有关火车的设计信息:引擎,汽车和守车。 NSDocument子类包含一个引擎对象,一个守车对象和0个或更多汽车对象。在这种情况下,您可能有3个NSView,每个都有自己的NSViewController来处理将数据从其对象移入和移出 View 的操作。

NSWindowController负责将每个NSViewControllerrepresentedObject设置为它可以理解的对象。例如,当 View 完成加载时,窗口 Controller 将:

    [engineViewController setRepresentedObject: engine];
    [cabooseViewController setRepresentedObject: caboose];

然后,您可以使用NSTableView显示汽车列表,并且(当正在查看汽车时),当更改选择时,窗口 Controller 可以使用[carViewController setRepresentedObject: car];(或者可以使用绑定(bind),具体取决于代码的结构) )。

这样,您就可以充分利用MVC范例的优势,因为 Controller 会根据需要将 View 链接到模型,但是顶层NSWindowController才真正理解文档结构。

关于objective-c - NSDocumentController currentDocument返回nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8912314/

10-10 02:49