11

我刚刚为我正在开发的应用程序添加了 iCloud 支持。它工作得很好,除了当我打开应用程序而没有聚焦文档时,会出现 iCloud 打开文件对话框,我不希望它出现!

在我的应用程序委托中,我有:

- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    [mainWindowController.window makeKeyAndOrderFront:self];
    return NO;
}

我用它来显示我自己的自定义窗口。但是现在,iCloud 打开文件对话框和我自己的对话框都显示了。关于如何摆脱 iCloud 对话框的任何想法?

默认窗口

4

6 回答 6

4

https://developer.apple.com/library/prerelease/content/releasenotes/AppKit/RN-AppKitOlderNotes/index.html

对 iCloud 的 NSDocument 支持

在 10.8 中,具有 ubiquity-container-identifiers 权利的基于 NSDocument 的应用程序获得了新的功能和 UI,以促进 iCloud 文档管理。

当启用 iCloud 并且第一次启动或重新激活应用程序并且没有可见或正在恢复的窗口时,NSDocumentController 将显示一个显示用户的 iCloud 库的非模态打开面板,而不是创建一个新的无标题文档。

...

不想为任何或所有 NSDocument 子类使用这些功能的应用程序可以覆盖 +[NSDocument usesUbiquitousStorage] 并返回 NO。如果所有应用程序声明的 NSDocument 子类都从此方法返回 NO,则 NSDocumentController 将永远不会显示新的非模态打开面板。

因此,如果您可以放弃使用本发行说明中列出的功能,请return NO访问+[NSDocument usesUbiquitousStorage]. 我确认您仍然可以从正常对话框打开/保存文件到 iCloud 存储中。

于 2017-01-27T22:51:09.070 回答
1

在您的 App Delegate 中放置以下代码可以让您绕过 iCloud 弹出的新文档屏幕。经过高山脉测试。

-(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];
    }
}
于 2018-01-19T21:50:33.500 回答
0
- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    [mainWindowController.window makeKeyAndOrderFront:self];
    return NO;
}

这部分是正确的。我刚刚测试过了。

只要确保你的这个类真的是你的应用程序代表。

  1. 创建一个名为prefixAppDelegate的新类
  2. 在您的MainMenu.xib中,将一个新对象拖到一边并将其自定义类设置为应用委托类
  3. 右键单击Application并从Delegate向下拖动到您的应用程序委托对象。
  4. 现在只需将上面的代码粘贴到您的应用委托类中

如果这仍然没有帮助,请尝试登录applicationShouldOpenUntitledFile:.

另外,我建议不要[mainWindowController.window makeKeyAndOrderFront:self];在此方法中设置。您应该使用应用程序委托方法applicationDidFinishLaunching:方法。

于 2012-12-25T11:13:56.847 回答
0

NSDocumentClass我的观察和修复:除非您从 *-info.plist中删除 Key,否则不会执行 [applicationShouldOpenUntitledFile:] 。但如果您的应用程序是基于文档的应用程序,这是有害的,它不会打开您链接的文档类型。

我的解决方法是直接在-(void)applicationWillFinishLaunching:(NSNotification *)notification 方法中打开我的自定义窗口(应用程序委托)

ETDocumentWindowController *windowController =  (ETDocumentWindowController*)get your own window controller here...;
[windowController.window makeKeyAndOrderFront:nil];
于 2015-06-05T02:56:30.727 回答
0

我想我会分享我对这个问题的解决方案,因为我看到其他人仍在寻找答案。它不是一个很好的解决方案,但它可以解决问题。

  1. 子类 NSDocumentController 并添加以下内容:

+ (void) setCanOpenUntitledDocument: (BOOL) _canOpenUntitledDocument
{
    canOpenUntitledDocument = _canOpenUntitledDocument;
} // End of setCanOpenUntitledDocument:

- (void) openDocument: (id) sender
{
    // With iCloud enabled, the app keeps trying to run openDocument: on first launch (before apphasfinishedlaunching gets set.
    // This method lets us check and see if the app has finished launching or not. If we try to open a document before
    // its finished, then don't let it.
    if(!canOpenUntitledDocument)
    {
        return;
    } // End of appHasFinishedLaunching not set

    [super openDocument: sender];
} // End of openDocument:

将以下内容添加到您的应用委托中:


- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    // Finished launching. Let us open untitled documents.
    [SQLProDocumentController setCanOpenUntitledDocument: true];

    ...
}

和推理 - 通过设置断点,openDocument我发现它在之前调用或被调用applicationDidFinishLaunching,这意味着添加这些方法是无用的。同样,这不是很好的代码,但它可以工作并且可以解决问题。(没有其他解决方案对我有用)。applicationShouldOpenUntitledFileapplicationShouldHandleReopen:hasVisibleWindows:

于 2019-01-18T13:45:10.387 回答
-1

我遇到了类似的问题——事实证明,在我的情况下,我必须NSDocumentClass从数组中的 Info.plist 中删除键和值CFBundleDocumentTypes。只有这样,该applicationShouldOpenUntitledFile:方法才会被调用,从而允许我阻止 iCloud/Document 窗口打开。

于 2013-04-02T06:07:52.040 回答