2015-12-28 91 views
1

我在Swift中编写基于NSDocument的应用程序。如果应用程序未使用文档参数启动,我已将其设置为打开默认文档。NSDocument打开默认文档

我注意到,如果我启动应用程序,然后立即打开另一个文档,比如说使用打开或最近,即使它未触及,仍然保留无标题的默认文档。

我的印象是,在这个工作流程中,Untitled文档被认为是“偶然的”,应该删除。它是否正确?如果是这样,我应该手动删除这个窗口,还是有一个我忽略的设置?

+0

是什么给你的印象是Untitled文件被认为是偶然的? –

+0

自20世纪80年代以来,这已在Mac HIG中定义。打开的文档应该替换未使用的默认文档。 –

回答

1

您描述的行为不是自动的。有关如何处理这种情况的示例,请参阅开源TextEdit示例代码。具体来说,take a look-[DocumentController replaceTransientDocument:]执行。

- (void)replaceTransientDocument:(NSArray *)documents { 
    // Transient document must be replaced on the main thread, since it may undergo automatic display on the main thread. 
    if ([NSThread isMainThread]) { 
     NSDocument *transientDoc = [documents objectAtIndex:0], *doc = [documents objectAtIndex:1]; 
     NSArray *controllersToTransfer = [[transientDoc windowControllers] copy]; 
     NSEnumerator *controllerEnum = [controllersToTransfer objectEnumerator]; 
     NSWindowController *controller; 

     [controllersToTransfer makeObjectsPerformSelector:@selector(retain)]; 

     while (controller = [controllerEnum nextObject]) { 
      [doc addWindowController:controller]; 
      [transientDoc removeWindowController:controller]; 
     } 
     [transientDoc close]; 

     [controllersToTransfer makeObjectsPerformSelector:@selector(release)]; 
     [controllersToTransfer release]; 

    // We replaced the value of the transient document with opened document, need to notify accessibility clients. 
    for (NSLayoutManager *layoutManager in [[(Document *)doc textStorage] layoutManagers]) { 
     for (NSTextContainer *textContainer in [layoutManager textContainers]) { 
     NSTextView *textView = [textContainer textView]; 
     if (textView) NSAccessibilityPostNotification(textView, NSAccessibilityValueChangedNotification); 
     } 
    } 

    } else { 
     [self performSelectorOnMainThread:_cmd withObject:documents waitUntilDone:YES]; 
    } 
} 

如果你还看-openDocumentWithContentsOfURL:display:error:和其他一些地方调用上面的方法,你会得到他们如何去替换“临时文档”是个好主意(以下简称“无题”的文件),与打开的文件。

我希望这会有所帮助。

+0

确实,我从来没有遇到过这个。虽然我在这里,但我注意到更新的应用程序完全跳过了这一点,并且通常会打开组合的开放/新对话框。如果这是新应用程序的首选行为,是否有方法来钩住它?这不是我读过的NSDocument dox。 –

+0

NSApplicationDelegate协议为“应打开未命名文档”提供了一个钩子。这可能是说“不”的好地方,并且也提供公开对话框。我会给出更具体的代码,但目前我还没有到位。 –