• 締切済み

MacのCocoaプログラミングについての質問です

Cocoaでメインのウィンドウと環境設定のウィンドウを作りたいのですが、 二つの方法を探し当てました。 1.環境設定の為のクラスを用意し、コントローラーがないnibファイルを   initのNSBundleのloadNibNamed:で読み込みウィンドウを作成する。 2.コントローラーがあるnibファイルをメインのウィンドウから   loadNibNamed:で読み込み、ウィンドウを作成する。 1の方法だとコントローラーがないため、テーブルビュー等が 使えません。(私の力不足?) 2の方法の場合、環境設定のウィンドウからメインのウィンドウの 変数にアクセスできない(?)為、不便です。 何か良い方法は無いでしょうか?? どなたかご教示、よろしくお願い致します。m(_ _)m

みんなの回答

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.4

>あるnibファイルのウィンドウと別のnibファイルの >コントローラーとを結びつける事はできるのでしょうか? コントローラでウィンドウを制御? ウィンドウにコントローラ? どっちもnibなら それをinitするクラスが居る筈だよね? そいつが値をやりとりすればいいだけなんじゃ? 必要ならウィンドウやコントローラを継承したクラスを作成して好きな変数を増やしてしまえば良いんだし。

tabibito1969
質問者

お礼

ううん、話が難しくなってきましたね。 一つのクラスで、複数のウィンドウの管理をする方法、解りました。 ちなみにどういう場合にウィンドウをnibファイルで分けるんでしょうか? メモリの消費量を抑える時でしょうか?

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.3

> 開かないようにする方法を教えて頂けませんでしょうか? いいえ、教えません。なぜなら推奨できない方法だからです。 がんばって、どこに出しても笑われないような、りっぱなプログラムを書こうと思いませんか?私は、進歩、成長しようという意欲のある方の力添えになるのは、こちらも気持ちがいいですが、やっつけ仕事でごまかそうというのに力を貸すのは、気持ちがいいものではありません。

tabibito1969
質問者

お礼

という事は、やはり、基本的にWindow一つに対して、nibファイルは一つという事なんですね。Appleの英文の資料を熟読する根性がなくて、よくわかっていません。 ちなみに仕事のプログラムでないので、やっつけ仕事で作るつもりはないですよ。

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> あるnibファイルのウィンドウと別のnibファイルのコントローラーとを結びつける事はできるのでしょうか? 「結びつける」がどういう意味なのかによりますが、Nibファイルどうしは、互いに独立しているということはいえます。それはオブジェクトは互いに独立しているということに由来します。 Objective-Cに限らず、プログラミングでいちばん気をつけなければいけないのは、あるオブジェクトから、ほかのオブジェクトを参照しようとするとき、そのオブジェクトはバッファされているのか、いないのか、あるいはバッファされていたが、開放されているのかということです。バッファされていないオブジェクト、変数を参照すると、そのとたんにエラーが起き、プログラムが停止します。 Nibファイルで生成するインスタンスは、すべてバッファされていることが前提になるので、そういう心配がいらず、Interface Builderを使った構成は、プログラマの負担を大きく減らしてくれます。反面、なんでもかんでもひとつのNibファイルにインスタンスを詰め込むと、むだにメモリを消費することになり、けっして感心できることではありません。環境設定ウインドウも、「MainMenu.xib」の中に作ってしまえば、いくらでもほかのウインドウのOutletと連結できるので、すごくプログラムが楽になりますが、開く頻度がひじょうに低い環境設定ウインドウを、常時バッファさせておくことは、いいこととはいえません。 あるNibファイルが、ほかのNibファイルのOutletを参照できるようにするということは、両方ともつねにバッファされている状態でなければならないので、おなじくメモリの無駄づかいということになります。

tabibito1969
質問者

お礼

ご丁寧なご回答どうもありがとうございます。 MainMenu.xibの中に環境設定ウィンドウを作れば・・・という事ですが、実は最初はそれがやりたかったのですが、MainMenu.xibの中にウィンドウを複数作ると、起動時に全部のウィンドウが開いてしまいます。 開かないようにする方法を教えて頂けませんでしょうか? 初歩的な質問かもしれませんが、本を見てもインターネットで調べても(日本語のサイトですが)見つける事ができませんでした。 どうぞ、よろしくお願い致します。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

1 コントローラそのものをメインウィンドウ側で変数として持てばいいんじゃない? 2 delegateを実装するか環境設定側をインスタンス化したときにself(メインウィンドウ)を(環境ウィンドウへ)渡す

tabibito1969
質問者

お礼

ご回答頂きどうもありがとうございます。 その後調べた結果、 1.ウィンドウだけでコントローラーの無いnibファイルを作成する。 2.環境設定の為のクラスを作成する。 3.nibファイルのFile's ownerのカスタムクラスに環境設定のクラスを登録する。 4.環境設定のクラスのinitメソッドでloadNibNamed:によりnibファイルを読み込むようにしておく。 5.メインのクラスで環境設定のクラスのインスタンスを生成する。 という方法で、メインのクラスから環境設定のウィンドウを生成する事が出来ました。 ところで、回答頂いた1についてですが、あるnibファイルのウィンドウと別のnibファイルのコントローラーとを結びつける事はできるのでしょうか?