2

私は持っていNS(Persistent)Documentます。

Xcode 経由でアプリケーションを実行し、(データなしで) 新しいドキュメントを作成してから、アプリケーションを終了します。この場合、initwindowControllerDidLoadNib:が呼び出されていることを確認できます。

Xcode でアプリケーションを再実行すると、以前のドキュメントが自動的に開きます。しかし、どちらも呼び出されていないことを確認できinitますwindowControllerDidLoadNib:

なぜそうなのですか?

4

1 に答える 1

7

あなたが見ているのはウィンドウの復元です。そのドキュメント (Document-Based App Programming Guide の一部) は次のように述べています。

ドキュメント アーキテクチャは、ウィンドウ復元プロセスで次の手順を実装します。ステップは、図 5-2 に示されている番号に対応しています。

  1. このNSWindowControllerメソッドsetDocument:は、ドキュメント ウィンドウの復元クラスを共有NSDocumentControllerオブジェクトのクラスに設定します。オブジェクトは、自身NSWindowに送信することによって状態が変化するたびに、復元可能な状態を無効にinvalidateRestorableStateします。
  2. 次の適切な時点で、Cocoa はウィンドウencodeRestorableStateWithCoder:メッセージを送信し、ウィンドウは ID とステータス情報を渡されたエンコーダーにエンコードします。
  3. システムが再起動すると、Cocoa はアプリを再起動し、restoreWindowWithIdentifier:state:completionHandler:メッセージをNSAppオブジェクトに送信します。

    アプリはこのメソッドをオーバーライドして、ウィンドウの復元に必要な一般的な作業を行うことができます。たとえば、新しい復元クラスに置き換えたり、別のバンドルからロードしたりできます。

    NSAppウィンドウの復元クラスをデコードしrestoreWindowWithIdentifier:state:completionHandler:メッセージを復元クラス オブジェクト [この場合、ドキュメント コントローラのクラス —Peter] に送信し、 を返しますYES

  4. 復元クラスはドキュメントを再度開き、そのウィンドウを見つけます。次に、ウィンドウをパラメーターとして渡された完了ハンドラーを呼び出します。
  5. CocoarestoreStateWithCoder:メッセージをウィンドウに送信します。ウィンドウは、渡されたオブジェクトから復元可能な状態をデコードし、NSCoderその内容の詳細を復元します。

[図 5-2、およびビュー、他のレスポンダー、およびドキュメントも保存および復元されることを説明する段落]

アプリが再起動されると、Cocoa はrestoreStateWithCoder:メッセージを関連するオブジェクトに順番に送信します。最初にNSApplicationオブジェクト、次に各NSWindowオブジェクト、次にオブジェクト、NSWindowController次にNSDocumentオブジェクト、そして状態を保存した各ビューに送信します。

ウィンドウ復元プロトコルは、ドキュメントに関係のないウィンドウにも使用されますが、ドキュメント機構がほとんどの面倒な作業を処理します。ウィンドウの復元のいずれかの側 (おそらく両側) で何かを行う必要がある場合は、ドキュメント内でオーバーライドencodeRestorableStateWithCoder:してください。restoreStateWithCoder:前者は選択などの一時的な情報を保存する場所であり、後者は復活したドキュメントとそのウィンドウでその情報を復元する場所です。

コーダーの存在は、ドキュメントがinitWithCoder:ではなくを使用して初期化されていることを意味しますがinit、これは (ウィンドウの復元のコンテキストでは) 信頼すべき文書化された事実ではありません。

于 2013-05-03T14:35:15.020 に答える