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

NSDocumentによるiCloudのサポート

10.8では、ubiquity-container-identifiersエンタイトルメントを持つNSDocumentベースのアプリケーションは、iCloudドキュメント管理を容易にする新しい機能とUIを取得します。

iCloudが有効になっていて、アプリケーションが最初に起動または再アクティブ化され、ウィンドウが表示または復元されていない場合、新しい無題のドキュメントを作成する代わりに、NSDocumentControllerはユーザーのiCloudライブラリを示す非モーダルの開いたパネルを表示します。

..。

NSDocumentサブクラスのいずれかまたはすべてにこれらの機能を使用したくないアプリケーションは、+[NSDocumentusesUbiquitousStorage]をオーバーライドしてNOを返すことができます。アプリケーションで宣言されたすべてのNSDocumentサブクラスがこのメソッドからNOを返す場合、NSDocumentControllerは新しい非モーダルオープンパネルを表示しません。

したがって、このリリースノートに記載されている機能の使用をあきらめることができる場合は、return NO+[NSDocument usesUbiquitousStorage]。通常のダイアログからファイルを開いてiCloudストレージに保存できることを確認しました。

于 2017-01-27T22:51:09.070 に答える
1

App Delegateに以下のコードを入れると、iCloudのポップアップする新しいドキュメント画面をバイパスできます。HighSierraでテスト済み。

-(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. [アプリケーション]を右クリックし、[デリゲート]からアプリのデリゲートオブジェクトまでドラッグします。
  4. 上記のコードをアプリデリゲートクラスに貼り付けるだけです

それでも問題が解決しない場合は、にログインしてみてくださいapplicationShouldOpenUntitledFile:

また、[mainWindowController.window makeKeyAndOrderFront:self];この方法では設定しないことをお勧めします。むしろ、アプリデリゲートメソッドapplicationDidFinishLaunching:メソッドを使用する必要があります。

于 2012-12-25T11:13:56.847 に答える
0

NSDocumentClass私の観察と修正:[applicationShouldOpenUntitledFile:]は、*-info.plistからKeyを削除しない限り実行されません。ただし、アプリがドキュメントベースのアプリケーションである場合、これは有害です。リンクしたドキュメントタイプは開きません。

私の修正は、カスタマイズされたウィンドウを-(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、呼び出されることがわかりました。つまり、これらのメソッドを追加しても意味がありません。繰り返しになりますが、これは優れたコードではありませんが、機能し、うまく機能します。(他の解決策のどれも私のために働いていません)。applicationDidFinishLaunchingapplicationShouldOpenUntitledFileapplicationShouldHandleReopen:hasVisibleWindows:

于 2019-01-18T13:45:10.387 に答える
-1

同様の問題が発生しました。私の場合、配列NSDocumentClassのInfo.plistからキーと値を削除する必要があることがわかりました。CFBundleDocumentTypesそうして初めて、applicationShouldOpenUntitledFile:メソッドが呼び出され、iCloud/Documentウィンドウが開かないようにすることができます。

于 2013-04-02T06:07:52.040 に答える