7

これは簡単なはずですが、何かが足りないに違いありません。ドキュメントベースのアプリケーションがあります。また、NSTableViewと、以前のファイルのリストを表示する3つのボタンを備えた新しいXIBを作成しました。アプリケーションが最初に起動したときに、ドキュメントウィンドウの代わりにこのXIBが表示されるようにしたいと思います。ユーザーが古いファイルを選択するか、[新規]ボタンを押したら、ドキュメントウィンドウに移動します。これは非常に一般的であり、私はかなり頻繁に使用されるのを見てきました。

これを機能させるために、project-info.plistファイルを変更し、メインNIBファイルのベース名をMyDocumentからSelectionXIB名に変更しました。これにより、アプリケーションはMyDocumentウィンドウではなくSelectionウィンドウを表示します。これまでは問題ないようです。

選択ウィンドウで、このXIB専用にテーブルビューと配列コントローラーおよびカスタムウィンドウコントローラーを設定しました。ファイルの所有者を新しいウィンドウコントローラーに設定し、ウィンドウコントローラーのウィンドウプロパティをウィンドウにバインドし、ウィンドウのデリゲートプロパティをファイルの所有者にバインドし、[選択]、[キャンセル]、[新規]ボタンを追加しました。NSApplicationには何もバインドされていません。しかし、奇妙なことに、このアプリケーションを実行すると、これらのコントローラーをNSApplicationに接続したいようです(他の2つのボタンについても同じです)。

アクションselectButton:をクラスNSApplicationのターゲットに接続できませんでした

また、NSApplicationが私の配列への参照を保持するアウトレットのKey-Valueに準拠していないというエラーも表示されます。アレイコントローラ、ウィンドウ、およびボタンは、NSApplicationではなく、新しいウィンドウコントローラにバインドされています。問題が発生した場合は、NSApplicationではなく、コントローラーがバインドされているウィンドウコントローラーについて言及することになると思いました。

ここで何が起こっているのか誰か知っていますか?「メインNIBファイルベース名」を「メインメニュー」から「選択」に変更したため、これはターゲットアクションの問題ですか?これを変更することになっていない場合、ドキュメントウィンドウを表示する前にCocoaで選択画面を表示できるようにするにはどうすればよいですか?

どんな助けでも大歓迎です。ロブ

4

1 に答える 1

9

ペン先のファイルの所有者のクラスのIBでの設定は、単なる助言です。これにより、IBは、そのクラスのインスタンスによって提供されるアウトレットとアクションのみを表示できます。ファイルの所有者はnibの一部ではないため、ファイルの所有者がそのクラスのインスタンスになることを強制するものではありません。

ファイルの所有者は、ペン先をロードするオブジェクトです。これは必然的にそれがペン先の外側にあり、ペン先の何もそれについて何も決定しないことを意味します。MainMenuペン先の場合、そのファイルの所有者(MainMenuペン先をロードするオブジェクト)はNSApplicationインスタンスです。したがって、MainMenuペン先でファイルの所有者に接続したものはすべて、アプリケーションではないとIBに指示した場合でも、アプリケーションオブジェクトに接続しました。

アプリケーションがMainMenuペン先の所有者であるということは、IBに何を伝えたかに関係なく、バグではありません。アプリケーションは常にMainMenuペン先の所有者です。これは正常で正しいことです。あなたはそれを変えることはできません、それを変えようとすべきではありません、そしてそれを変える必要はありません。

バグは、一言で言えば、2つの非常に異なる目的のために1つのペン先を使用していることです。

MainMenuペン先をそれだけにして(MainMenu、カスタムドキュメントコントローラー(すぐに説明します)、アプリデリゲートのみを含む)、前のドキュメントウィンドウを所有する別のペン先に移動する必要があります。以前のドキュメントウィンドウコントローラ。ウィンドウコントローラをこのペン先の所有者にするためには、ウィンドウコントローラにロードさせる必要があります。これはコードで行う必要があります。IBやplistで設定することはできません。

アプリケーションのデリゲートで、ウィンドウコントローラーをインスタンス化して所有します。カスタムNSWindowControllerサブクラスを作成したように思われるので、それをオーバーライドして、nibをロードして所有するためのメッセージを自分自身initに送信させることができます。initWithWindowNibName:次に、とを使用allocinitて、アプリデリゲートからウィンドウコントローラーを作成します。

これにより、コンソールメッセージが削除され、ボタンが実際にウィンドウコントローラーに接続されていることを確認します(この変更により、ウィンドウコントローラーになるファイルの所有者に接続されているため)。

applicationOpenUntitledFile:ウィンドウコントローラーにshowWindow:メッセージを送信して、アプリの代理人に応答してもらいます。これにより、ユーザーが通常は新しいドキュメントを作成するときに、以前のドキュメントウィンドウが表示されます。

ドキュメントを作成する通常の方法をサポートする(つまり、新しいドキュメントを機能させる)場合は、ではなく、を実装applicationDidFinishLaunching:します。ドキュメントが開いていないことを確認し、その場合はウィンドウを表示します。applicationShouldHandleReopen:hasVisibleWindows:applicationOpenUntitledFile:

また、NSDocumentControllerのカスタムサブクラスを作成し、ドキュメントコントローラーをそのインスタンスにし、そのクラスで、最後に開いたドキュメントが閉じられたときに前のドキュメントウィンドウを実装addDocument:removeDocument:て再表示し、ドキュメントが閉じられたときに非表示にする必要があります。オープンしました。

于 2010-10-11T04:51:27.883 に答える