我正在开发第一个基于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负责将每个NSViewController
的representedObject
设置为它可以理解的对象。例如,当 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/