ココアドキュメントベースのアプリケーションを起動すると、最初に選択ウィンドウが表示されます

StackOverflow https://stackoverflow.com/questions/3903264

質問

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

これを機能させようとする私は、Project-info.plistファイルを変更し、mydocumentからmydocumentからmy selection xib nameにメインニブファイルのベース名を変更しました。これにより、アプリケーションはMyDocumentウィンドウの代わりに選択ウィンドウを表示します。これまで問題はないようです。

選択ウィンドウで、このXIBのためだけにテーブルビューとアレイコントローラーとカスタムウィンドウコントローラーをセットアップしました。ファイルの所有者を新しいウィンドウコントローラーに設定し、ウィンドウコントローラーのウィンドウプロパティをウィンドウとウィンドウのデリゲートプロパティをファイルの所有者と「選択」、「キャンセル」、および「新しい」ボタンに縛り付けました。 nsapplicationに拘束されるものはありません。しかし、奇妙なことは、このアプリケーションを実行すると、これらのコントローラーをエラー(他の2つのボタンでも同じ)でnSapplicationに接続したいと思われます。

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

また、nsapplicationは、私の配列への参照を保持するアウトレットに鍵と価値のあるものではないというエラーを表示します。アレイコントローラー、ウィンドウ、およびボタンは、新しいウィンドウコントローラーではなく、NSApplicationにバインドされています。問題があれば、nsapplicationではなく、コントローラーがバインドされるウィンドウコントローラーに言及することは期待していたでしょう。

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

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

役に立ちましたか?

解決

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

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

アプリケーションがMainmenuNibの所有者であることは、あなたがIBに伝えることに関係なく、バグではありません。アプリケーションはです いつも Mainmenunibの所有者。それは正常で正しいです。変更することはできませんし、変更しようとしないでください。また、変更する必要はありません。

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

Mainmenu inibを単独で、Mainmenu、カスタムドキュメントコントローラー(すぐに到達します)、およびアプリデリゲートのみを含む必要があります。以前のドキュメントウィンドウコントローラー。ウィンドウコントローラーをこのペン先の所有者にするには、ウィンドウコントローラーにロードする必要があります。コードでそれを行う必要があります。IBまたはプリストでそれを設定することはできません。

アプリケーションのデリゲートでは、ウィンドウコントローラーをインスタンス化して所有しています。カスタムnswindowControllerサブクラスを作成したように聞こえるので、そのオーバーライドを作成できます init それを自らに送らせる initWithWindowNibName: ペン先をロードして所有するメッセージ。次に、使用するだけです allocinit アプリデリゲートからウィンドウコントローラーを作成します。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top