2009-05-02 5 views
34

これは自動的には起こりませんが、Dockアイコンをクリックすると自動的にアプリケーションウィンドウが開きたいと思っています。ドックアイコンをクリックしたときにアプリケーションウィンドウを開くにはどうすればよいですか?

私はアプリを開くとウィンドウが自動的に開きますが、ウィンドウの十字をクリックしてもアプリケーションは実行したままにしておくと、ドックアイコンをクリックするとウィンドウが開かれません。

+1

これは自動的に発生します。あなたはもっと具体的になりますか? –

答えて

64

は、アプリのデリゲートに- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flagを実装します。戻り値の詳細については、ドキュメンテーションを確認してください。

ドキュメントベースのアプリケーションと非ドキュメントベースのアプリケーションは、動作が多少異なります。ドキュメントベースのアプリケーションのドックアイコンがクリックされたときに開いているウィンドウがない場合は、新しいドキュメントが作成されます。非ドキュメントベースのアプリケーションのドックアイコンがクリックされたときに開いているウィンドウがない場合、何もしません。

+0

ありがとう! – Joshua

+0

私は2つの開いたウィンドウ、メインウィンドウと子ウィンドウを持っている場合はどうですか?子ウィンドウにフォーカスがあります。ドックアイコンをクリックした後、メインウィンドウをフォーカスするように設定する必要があります。 – BUDDAx2

5

アプリケーションがアクティブになると、ドキュメントベースのアプリケーションが新しいタイトルのないドキュメントを自動的に開きます。ドキュメントベースではないアプリケーションを指していると仮定しています。

アプリケーション代理人にapplicationDidBecomeActive:メソッドを実装し、ウィンドウを開く/表示します。

編集:Delegates

一部の情報。

Opening and Closing Windowsの一部の情報及びNSWindow API

+0

applicationDidBecomeActive:メソッドの実装方法がわかりません。私にコードを分けてもらえますか/例/ – Joshua

+0

IBの非表示のチェックボックスはどこにありますか? – Joshua

+0

@Joshua - 申し訳ありませんが、それは正反対です。 nibファイルのウインドウのインスペクタを選択した場合は、 "Visible at Launch"がチェックされていることを確認してください。 –

9

これは、非文書ベースのアプリケーションのメインウィンドウを閉じた後に画面に戻すために行うことです。これが正しい方法ではないかもしれないことは分かっていますが、これまでのところ私のために働いています。

AppDelegateでこれを実装すると、ウィンドウは同じオブジェクトのインスタンス変数として定義されます。

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

もっと良い解決策をお持ちの方は、返信してください。ありがとう!リニューアルオープンウィンドウはもうマウスイベントに反応しなかった受け入れ答えで

:受け入れ答えに追加する

+0

私もこれを理解しようとしていました(ドキュメントベースのアプリケーション用に別のウィンドウを表示する方法)、これは完璧に機能しました! – Kyle

10
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag 
{ 
    if (flag) { 
     return NO; 
    } 
    else 
    { 
     [YourWindow makeKeyAndOrderFront:self];// Window that you want open while click on dock app icon 
     return YES; 
    } 
} 
2

Aソリューション。

受け入れられた回答を使用する場合は、IBのウィンドウの属性インスペクタで「終了時に解放する」チェックボックスをオフにする必要があります。これにより、応答しないウィンドウの問題が修正されます。

1

他の人が指摘しているように、applicationShouldHandleReopenの非ドキュメントアプリで閉じたウィンドウを再び開く方法は正しい方法です。私が追加したい唯一の変更は、NSApplicationの可視と不可視のリスト.windowsを繰り返し、必要なウィンドウを確認することで、どのウィンドウを再表示する必要があるかを確認する柔軟性の高い方法です。

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { 

    if flag == false { 

     for window in sender.windows { 

      if (window.delegate?.isKind(of: WelcomeWindowController.self)) == true { 
       window.makeKeyAndOrderFront(self) 
      } 
     } 
    } 

    return true 
} 

付録

ウィンドウが隠されていた場合、ユーザーがアプリのDockアイコン、そうapplicationShouldHandleReopenメソッドを実装する必要はありませんをクリックしますときa)は、それが自動的に示されたことになります。

b)チェック「閉鎖時にリリース」オプションは、上記の動作に何らかの影響を与えません。

関連する問題