2009-05-25 7 views
3

初心者のために、IBと可能な限りのすべての接続が私にとって驚きです。私が見つけたほとんどのチュートリアルは、スパゲティコードの生まれ変わりと呼ばれるものです。エンタングルメントはすべてドラッグによって作成されたすべての接続です。もちろん、私はビューのレイアウト(視覚的要素を配置するサイジング&)のためにIBを使用したいと思います。しかし、コントローラはビ​​ューではないので、すべてのコントローラがコードであり、IBのどこにも表示されない場合、混乱は少なくなります。私はこれがスパゲッティを最小限に抑えると思う。また、1回の視聴ごとの朗報を奨励します。その目的のために、ここに質問があります。この戦略を遵守するサンプルプロジェクトはどこにありますか?コントローラーをxibから外す方法

答えて

1

良い質問です。私が固執しようとしているのは、コントローラーをコードで作って、そのコードとやりとりするXIB/NIBのものにIBOutletsとIBActionsを追加し、コントローラーのコンストラクターに「self」というXIB/NIBをロードするもの所有者であり、IBで私は "File's Owner"プレースホルダに物を接続します。プレースホルダは自分のIDを私のコントローラのクラスに指定します。

4

サンプルプロジェクトはありませんが、XIBファイルやコードにコントローラを作成する必要がある場合や、どのように動作するかについての情報を提供します。

コントローラがユーザーの操作によって動的に作成された場合、通常はXIBファイルでコントローラをインスタンス化しません。代わりに、上記の害のようなコードでインスタンス化します。これを行うと、コードで作成されたこのコントローラをIBで作成したユーザーインターフェイス要素に接続するためのメカニズムが必要になります。

IBがこれを解決するために提供するメカニズムは、File's Ownerです。 Interface Builderを使用するには、ファイルの所有者を習得することが不可欠です。

ファイルの所有者は、XIBファイルの "内"のオブジェクトではなく、XIBファイルで表されるオブジェクトです。これは、XIBファイルが読み込まれるときに既に存在するオブジェクトのプレースホルダです。実行時にNIBファイルがロードされると、NSBundleメソッド[NSBundle loadNibNamed:ownwer:options:]がロードされます。 ownerパラメータは、XIB/NIBファイル内のファイルの所有者プレースホルダオブジェクトを解決するために使用されます。ファイルが実行時にロードされると、ファイルの所有者に対して行われたすべての接続は、ownerパラメータとして渡されたオブジェクトに対してNSBundleメソッドに解決されます。 iPhoneでは、通常NIBファイルを自分でロードしません。代わりにUIViewControllerがそれを行います。 UIViewControllerのloadViewメソッドのデフォルトの実装は次のようなものになります。だから、

- (void)loadView { 
    [[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil]; 
} 

を、ファイルの所有者に、あなたのXIBファイル内の要素を接続することにより、あなたはあなたのビューコントローラにそれらを接続することがあります。

アプリケーションに静的に存在するコントローラがいくつかあります。これらのコントローラは永遠に生きています。ルート項目とともにナビゲーションまたはタブコントローラは、通常、アプリケーションの全期間にわたって生きています。その場合、MainWindow.xibファイルにこれらのView Controllerを設定します。他のコントローラーのほとんどは動的に作成され、ユーザーの操作に応じてプログラマチックに作成されます。

+0

ありがとう、ジョン、それは有用な情報です。私はまだIB側にコントローラを持たない戦略を試したいと思っています。あなたはそれが可能であることに同意しますか?私はまだコード例を探しています... – bedouger

+0

すべてのことができます。しかし、私は上記のアプローチをお勧めします。 MainWindow.xibファイルに静的コントローラを作成し、ユーザアクションに応答して、コード内に他のコントローラのほとんど(通常はすべて)を作成します。 –

関連する問題