我向我的应用程序委托添加了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
答案 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的窗口。
我解决了删除"是初始控制器"故事板中的复选框。