2012-02-20 3 views
2

私はドキュメントアーキテクチャを使用してCocoaアプリケーションを作成しています。このアプリで無題の文書が作成されるたびに、テンプレートを選択して他の情報の入力を促すウィンドウが表示されます。これらのウィンドウのうちの1つだけが一度に表示されるべきであり、好ましくは、テンプレート選択が表示されている間、アプリケーションの残りの部分と対話することが可能であるべきである。 (これは、ページがどのように振る舞うかである。)私は-[NSDocumentController openUntitledDocumentAndDisplay:error:]をオーバーライドすることで、この作業のほとんどを持っているモーダルでないテンプレートチューザを同期的に表示

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument 
           error:(NSError *__autoreleasing *)outError { 
    TsDocument * doc = [self makeUntitledDocumentOfType:self.defaultType 
                error:outError]; 
    if(!doc) { 
     return nil; 
    } 

    TsNewWindowController * newController = [TsNewWindowController new]; 
    newController.document = doc; 

    if([NSApp runModalForWindow:newController.window] == NSRunAbortedResponse) { 
     if(outError) { 
      *outError = [NSError errorWithDomain:NSCocoaErrorDomain 
              code:NSUserCancelledError 
             userInfo:nil]; 
     } 
     return nil; 
    } 

    [self addDocument:doc]; 

    if(displayDocument) { 
     [doc makeWindowControllers]; 
     [doc showWindows]; 
    } 

    return doc; 
} 

しかし、あなたが見ることができるように、ウィンドウは残りのへのアクセスをブロックし、モーダル表示されますアプリ。テンプレートピッカーをモ​​ーダルにすることなく、私が望むものを達成する簡単な方法はありますか?


より明確にカップルの事を説明するために:

  1. 私はもちろん-runModalForWindow:ウィンドウがモーダル-それが名前に権利があります実行されることを知っています!私はまだブロック-openUntitledDocumentAndDisplay:error:をブロックするウィンドウを表示するための別の方法を探しています。または、メソッドをブロックする必要はありません。私は、私は単に文書を作成することができると信じてnewControllerのウィンドウを表示し、アプリが終了した場合、ので、後でドキュメントのmakeWindowControllersshowWindowsを呼び出し、復元しません

  2. は、テンプレート表示されませんチューを、それが示しています通常の編集インターフェース。

答えて

4

NSWindowControllerを作成して使用する必要がありますが、openUntitledDocument…::を呼び出す前に行う必要があります。未発表のAdiumのエクストラクリエーターで

が、私はいくつかの点ででタップ:applicationOpenUntitledFile:で、アプリケーションのデリゲートで

  • 、私は、テンプレート選択ウィンドウを表示し、YESを返します。
  • ドキュメントコントローラでは、removeDocument:にメッセージをsuperに渡し、まだ開いているドキュメントがあるかどうかを確認します。そうでなければ、私はテンプレートチューザーウィンドウを表示します。
  • addDocument:のドキュメントコントローラでは、テンプレートチューザウィンドウを非表示にしてからsuperに渡します。
  • したがって

:にユーザ試行は任意の手段によって(ない特定の種類の)新しい文書を作成する場合

  • 、テンプレートセレクタが代わりに表示されます。
  • ユーザが(明示的なタイプの)新しい文書を作成すると、テンプレートチューザは非表示になります。 (私が行ったアプリケーションでは、特定のタイプを含むサブメニューとして「新規」メニュー項目が設定されていました。)
  • ユーザーが任意の方法で文書を開くと、テンプレートチューザーが非表示になります。
  • 最後に開いたドキュメントを閉じると、テンプレートチューザが表示されます。
  • ユーザまたは他のアプリケーションが何らかの方法でアプリケーションを再開しようとすると、テンプレートチューザが表示されます。
1

あなたはrunModalForWindow:と呼んでいるので、もちろんモーダルウィンドウとしてウィンドウを実行しています。

代わりにウィンドウを表示してみませんか? NSWindowControllerを使用し、showWindow:を呼び出してテンプレートウィンドウを表示します。ウィンドウコントローラで、ユーザーの選択に反応するアクションを実装し、適切なドキュメントを作成する(またはキャンセルする)。

openUntitledDocumentAndDisplay:error:に実際にドキュメントを作成する必要はありません。

+0

「-runModalForWindow:」はモーダルウィンドウを実行することを覚えています。元の投稿を拡大して、その点についてさらに詳しく返信します。開いているドキュメントを返さずに、 '-openUntitledDocumentAndDisplay:error:'から実際に戻ることはできますか?私の呼び出し元が私にエラーを表示しようとしませんか? –

+0

試してみるとどうなりますか? –

+0

'openUntitledDocumentAndDisplay:error:'から 'nil'を返すと、例外がスローされます。 '' outError''は、間違いなく助けになりません。 –

関連する問題