为什么不调用applicationShouldOpenUntitledFile?

时间:2011-09-27 04:45:14

标签: macos cocoa appkit

我向我的应用程序委托添加了applicationShouldOpenUntitledFile方法,并按照Apple的文档指定返回NO。但是,我仍然在启动时获得一份新文档。怎么了?

@implementation AppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLog( @"This is being called" );
}

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    NSLog( @"This never is" );
    return NO;  
}

@end

5 个答案:

答案 0 :(得分:10)

你正在运行Lion。在添加applicationShouldOpenUntitledFile处理程序之前运行时,会创建一个新文档。现在,使用10.7的“退出和重新打开应用时恢复窗口”,您的应用程序正在恢复那个无标题窗口,而不是按照您的想法创建新窗口。

关闭该窗口并重新运行您的应用程序,将调用applicationShouldOpenUntitledFile并禁止创建新的无标题文件。

答案 1 :(得分:6)

-(void)applicationDidFinishLaunching:(NSNotification *)notification
{
    // Schedule "Checking whether document exists." into next UI Loop.
    // Because document is not restored yet. 
    // So we don't know what do we have to create new one.
    // Opened document can be identified here. (double click document file)
    NSInvocationOperation* op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(openNewDocumentIfNeeded) object:nil];
    [[NSOperationQueue mainQueue] addOperation: op];
}

-(void)openNewDocumentIfNeeded
{
    NSUInteger documentCount = [[[NSDocumentController sharedDocumentController] documents]count];

    // Open an untitled document what if there is no document. (restored, opened).       
    if(documentCount == 0){
        [[NSDocumentController sharedDocumentController]openUntitledDocumentAndDisplay:YES error: nil];
    }
}

答案 2 :(得分:1)

如果您正在运行Lion / 10.7或更高版本,那么在{{em>其他窗口打开时(即使是非文档窗口)时,这仍然会发生应该调用{1}}。

我有一个基于文档的应用程序,其中AppDelegate类打开一个全局日志记录窗口,用于调试目的和用户状态消息。如果我在OS X 10.6上运行时程序在启动时显示该窗口,则applicationShouldOpenUntitledFile永远不会被调用,即使没有显示文档窗口。如果我关掉那个窗口,就会打电话。

答案 3 :(得分:1)

自OSX Lion以来,应用程序的状态恢复可能会干扰您对此练习的自定义偏好。

引用Aaron Hillegass和Adam Preble的书Cocoa Programming for MacOSX的更新:

  

请注意,Mac OS X Lion的状态恢复功能可能会使观察新的文档首选项变得棘手。您可以通过编辑Xcode中的Run方案来禁用状态恢复。打开产品菜单,然后选择编辑方案。选择Run RaiseMan.app方案,切换到Options窗格,然后选中Disable state restoration。

答案 4 :(得分:1)

我使用Xcode 8.3.2并使用故事板为基于文档的应用程序编译Os X 10.11。 我注意到,如果将窗口控制器设置为初始控制器,则会创建一个没有任何文档且不调用applicationShouldOpenUntitledFile的窗口。

我解决了删除"是初始控制器"故事板中的复选框。