2013-03-06 10 views
27

私はCocoaを新しくしましたが、.nibファイルのFile's Ownerという概念を理解できません。ここでファイル所有者(インタフェースビルダー内)とは何ですか?

は、私は物事を見るような方法である:

  • は、ウィンドウがどのように見えるかを記述するファイルmyNibFile.nibファイルを考えてみましょう。

  • ここで、この.nibファイルに実際のウィンドウを接続します。だから、私はNSWindowControllerのサブクラスであるクラスmyWindowを作成します。そして、この接続を行うために、私はこのようなinit方法を変更します。

     -(id)init 
        { 
         [super initWithWindowNibName:@"myNibFile"]; 
         return self; 
        } 
    
    ので

、私はmyWindow、「システム」のインスタンスを作成するときに行くと.nibを見ていきますことを理解し適切なオブジェクトを作成します。

だから、私の質問は以下のとおりです。

  • は、なぜ私は私の.nibファイルのFile's OwnermyWindowであることを指定する必要がありますか?冗長ではないですか?

  • 私は実際に何がFile's Ownerを理解していないことを意味すると思います。それは何ですか ? .nibファイルが何かに属しているのはなぜですか?私の "アプリケーション"の "どこか"にすることはできませんし、必要なときに "システム"がそこに行き、それを使用しますか?

これらの新しいコンセプトをよりわかりやすくお伝えいただきありがとうございます。

答えて

41

2点:

  • ファイルの所有者は、ペン先、メッセージloadNibNamed:又はinitWithNibName:を受ける、すなわち、そのオブジェクトをロードするオブジェクトです。
  • ロード後にペン先のオブジェクトにアクセスするには、ファイルの所有者にアウトレットを設定します。

こうして、たくさんのボタン、サブビューなどを含むファンシービューを作成しました。ロードオブジェクト(通常はビューまたはウィンドウコントローラ)からnibをロードした後、これらのビュー/オブジェクトのいずれかを変更する場合は、これらのオブジェクトのアウトレットをファイル所有者に設定します。それは簡単です。

これは、デフォルトでは、すべてのView ControllerまたはWindow Controllerがファイル所有者として機能し、nibファイルのメインウィンドウまたはビューオブジェクトへのコンセントを持つ理由です.Duh、間違いなくあなたにそれにメッセージを送ることができるようにコンセントを持つ必要があります。

ファイル所有者と呼ばれ、特別な場所が与えられた理由は、ペン先の他のオブジェクトとは異なり、ファイル所有者がペン先の外部にあり、ペンの一部ではないためです。実際には、ペン先がロードされたときにのみ使用可能になります。したがって、ファイル所有者は、後でペン先をロードする実際のオブジェクトのスタンドインまたはプロキシです。

ご理解いただきたいと思います。あなたが尋ねるならば、私はポイントのいずれかを明確にします。

+0

答えをありがとう。最後の段落が私にとって最も重要です.File's Ownerはペン先の一部ではありません。 あなたがあなたに追加するオブジェクトにアウトレットが属している可能性があるので、あなたはアウトレットが必要です...という回答は私にとっては有効ではありません。 私は、オブジェクトとNIBをコード( 'loadNibNamed'など)でリンクする(実際に*する必要があります)ので、' File's Owner'という冗長リンクは必要ないと思っています。次に、アウトレットをこのオブジェクトにどのように接続しますか?あなたはこの点に答えます。 – Colas

+0

私は満足のいく答えを待っていました!たぶんあなたは最後の段落を強調するためにあなたの答えを再編成することができます。ありがとう。最後のコメントがはっきりしていることを願っています – Colas

1

ファイルオーナーはIBのプレースホルダであり、コード内のすべてのアウトレットとアクションはIBで「リンク可能」なので、コントロールドラッグして画面上のものをコードに接続します。

0

Interface BuilderのFile's Ownerは、親のオブジェクトタイプを知るようになっています。これは2つの方法で使用されます。まず、Interface Builderで、IBがあなたに接続できるアウトレットとアクションを知るようにします。第2に、アプリケーションフレームワークは、nibファイルがロードされた後、コードの残りの部分に物事を再接続する方法を知るためにアプリケーションフレームワークによって使用されます。

5

基本的なことは、インターフェイスビルダを使用すると、プログラムの部分に労力をかけずに、自動的に相互に接続されたオブジェクトを作成できることです。ビュー以外のオブジェクトを含むあらゆる種類のオブジェクトをインスタンス化することができ、それらは相互に関連付けることができます。たとえば、ビュー自体と一緒にテーブルビューデータソースのインスタンスを作成することができます。このメカニズムは、メインメニューNIB内でアプリケーション代理人を作成するためによく使用されます。

しかし、すべてがドラッグ&ドロップによって行われるので、1つの例外を除いて、NIBオブジェクトと既にアプリケーションに存在するオブジェクトの間に接続を形成することはできないようです。

コードにNIBファイルがロードされているときに、NIBが "ファイル所有者"とみなすという1つのオブジェクトを指定するオプションがあります。これは、Interface Builder内で表示されるプレースホルダです。アプリケーション内の任意のオブジェクトを表すことができるため、Interface Builderでは、使用可能なアクション/アウトレットを知ることができません。このため、属性タブでファイル所有者の「クラス」を変更することができます。

ファイルオーナーは実際には「所有権」または「親子関係」を表していません。それが表すのは「このNIBをロードしたオブジェクト」です。思い出されるべき

+1

私のプログラムから実際にNIBを呼び出す方法は、 'initWithWindowNibName:@" myNibFile "'であるので、私はまだ理解しません。この指示で、NIBと他のオブジェクトとの間の接続を作成します。 – Colas

関連する問題