1

さて、私はCocoaとObjective-C、そして一般的にOOPにかなり慣れていません。

背景として、ユーザーのドキュメントをパッケージに保存する拡張可能なエディターに取り組んでいます。もちろん、これにはいくつかの問題を回避するための「楽しみ」が必要でした(つまり、バンドル内のすべてのドキュメントNSFileWrapperを作成しないようにするための、やや卑劣な書き込みと読み込みのプロセス)。私が到達した解決策は、基本的にサブクラスを単なるシェルとしてNSFileWrappers扱うことでした。それを使用してバンドルのフォルダーを作成し、ドキュメントの実際のコンテンツの書き込みを他のメソッドに渡します。NSDocument

残念ながら、ある時点で私は完全に犬をねじ込んだようです。これがどのように発生したかはわかりませんが、ドキュメントウィンドウを閉じてもドキュメントが解放されなくなりました。ウィンドウが正常に閉じても、ドキュメントオブジェクトは「閉じる」メッセージ(または関連するメッセージ)を受信して​​いないようです。

その結果、アプリを起動し、新しいドキュメントを作成して保存し、閉じてから再度開こうとすると、ドキュメントウィンドウが表示されなくなります。いくつかのクリエイティブなサブクラス化とを使用NSLoggingして、ドキュメントオブジェクトがまだメモリ内にあり、NSDocumentControllerインスタンスにアタッチされていることがわかりました。そのため、ドキュメントを開こうとしても、NSDocumentController's「うーん、現在、そのオブジェクトを開いています」チェックを通過することはありませんでした。

NSWindowControllerとインスタンスはありNSDocumentControllerましたが、プロジェクトから完全に削除しました。NSDocument問題がどこにあるかを見つけるために、ほぼすべての方法をオーバーライドしました。私の知る限り、Interface Builderのバインディングはすべて正しいです。メインメニューの「閉じる」はperformClose:、ファーストレスポンダーなどにアタッチされています。また、新しいメインメニューとドキュメントxibも試してみました。

バンドルのコードを書くのはおかしいのではないかと思ったので、基本的にすべて削除してゼロから始めましたが、うまくいかなかったようです。メソッドオーバーライドを削除しました-initが、それも役に立ちませんでした。ここには単純なドキュメントアプリのソースがないため、次の論理的な手順を試しませんでした(readFromUrlandwriteToUrlメソッドで既知の動作するコードを私のものに置き換える)。

私はこの問題を約16時間途切れることなくトラブルシューティングしてきましたが、言うまでもなく、私はロープの終わりにいます。理解できない場合は、バンドルドキュメントの混乱に基づいて、より多くのコードと強度を使用して、プロジェクトを最初から試してみるつもりです。

4

1 に答える 1

1

コードなしではわかりませんが、送信することをお勧めします:

closeAllDocumentsWithDelegate:didCloseAllSelector:contextInfo:

...ドキュメントコントローラに送信し、デリゲートに渡されるときにコントローラを確認して、状態がどのように変化するかを確認します。

明示的なメッセージを送信したときにコントローラーがドキュメントを閉じる場合、問題はウィンドウへのバインドにあります。

于 2010-04-25T15:59:29.003 に答える