2011-02-02 16 views
11

私は物事を整理し、私のアプリのビューの階層を作成しようとしています。 たとえば、テキストを表示するカスタムビューを作成し、進行状況を表示するための別のカスタムビューを作成して、ビューベースアプリケーションテンプレートで作成したメインビューでそれらのビューをすべて使用したいとします。Interface BuilderのカスタムUIView

私はプログラムでそれを作成する方法をを知っている - あなたはUIViewサブクラスを作成、のdrawRectメソッドを実装し、Interface Builderで空UIViewを配置し、それが私のカスタムクラスにクラスだチャンス。私の問題は、代わりにこれらのカスタムビューのをInterface Builderで作成したいということです。プログラムではです。

は、これまでのところ私はXIBファイルでUIViewControllerコントローラを作成したテンプレートからビューコントローラのviewDidLoad方法で私は、カスタムビューコントローラのインスタンスことを作成し、(Interface Builderで追加した空UIViewのサブビューとして、それは、ビューの追加しますプログラムのアプローチでクラスを変更する場合も同じです)。

これはうまくいくものですが、私にとってはハックの問題で、viewDidLoadメソッドを実装せずにインターフェイスビルダでこれらのカスタムビューを追加してコントローラを作成することはできません。そのメソッドの内部にビューを追加します。

答えて

0

多分私はあなたを理解していませんか?
あなたはInterface Builderにライブラリを持っています。あなたが望むすべてのコンポーネントを移動して、あなたのビューに置くことができます。 (UIViewを追加して別のビューを追加し、4番目のタブでクラス名を変更できます)。
次に、IBOutletでvarsを宣言し、urファイルの所有者の2番目のタブからコンポーネントに接続します。別の質問ですか?

+0

うーん..さんは、私は私のプロジェクトでは4 XIBs持っているとしましょう - 2「標準」ビューベースのアプリケーションテンプレートXIBs:MainWindows.xibとTestViewController.xibを。 CustomTextView.xibとCustomProgressView.xib:別のXIBでのすべてのビュー - 今すぐきれいなものを維持するために、私は2つの追加ビューの作成をしたいと思います。 UILabelとUIButtonを最初に追加し、UILabel UIProgressViewを2番目のものに追加します。これらの2つのカスタムビューをTestViewController.xibビューに追加します。どのようにすればいいですか(私がやったやり方とUIViewサブクラスでdrawRectのすべてを描くのではなく、XIBデザインを使用する以外) – shw

+0

私はyou.ifを持っていると思うCustomTextViewとCustomProgressViewはビューまたはそれを拡張する、あなたはメインビューにUIViewを追加する必要があります - exmaple mainWindow-とIDインスペクタ(インスペクタの4番目のタブ)UIViewからクラスを変更する必要がありますクラスをurする(CustomProgressView eg)。 – Ratinho

+0

[OK]を - しかし、そのために、私はUIViewのサブクラスのあるクラスを作成する必要があります - それ以外CustomTextViewは、クラスのフィールドには表示されません。私が作成したCustomTextView.xibファイルとどうすれば接続できますか?私はinitWithCoderメソッドをオーバーライドし、 '[NSBundle loadNibNamed]'メソッドを使ってそのxibをロードし、そのUIViewサブクラスのサブビューとして返す最初のビューを追加しましたが、やはりハッキングのような感じがしています。 – shw

1

これを行うには、カスタムコントロールのクラスを使用するInterface Builder用のプラグインを作成する必要があります。プラグインを作成してインストールするとすぐに、ビューのインスタンスをInterface Builderで別のウィンドウまたはビューにドラッグアンドドロップして追加することができます。 IBプラグインの作成については、Interface Builder Plug-In Programming Guideと、Aaron Hillegassの書籍Cocoa Programming for Mac OS Xから独自のIBパレットコントロールを作成する章を参照してください。

Hereは、受け入れられた回答の元の著者へのリンクa similar questionです。

0

残念ながら、UIKitでやりたいことはできません。 IBプラグインはOS Xのみで動作し、AppleはiOS開発での使用を明示的に許可していません。静的ライブラリではないものと何か関係があります。誰が知っている、彼らはいつかこれを変更する可能性がありますが、私はあなたの息を止めません。

1

これはもともとRatinhoのスレッドのコメントですが、大きすぎます。

私自身の経験は、ここで述べたすべてのことに同意しますが、あなたの苦痛を和らげたり、少なくともハック・アイを少し感じさせるものがあります。

すべてのカスタムUIViewクラスを共通のクラス、たとえばEmbeddableViewから派生させます。初期化するNIBを決定するために、クラスID(またはオーバーロード可能なメソッド)を使用して、この基本クラスのinitWithCoderロジックをすべてラップします。これはまだハックですが、インターフェースを正式化し、機械を隠すことは少なくともあります。

さらに、独自の委任プロトコルを使用してデリゲート/アクションメソッドを処理し、メインのUIViewControllerとのギャップを埋めるためにカスタムビューとペアになった「マイクロコントローラ」クラスを使用することで、インターフェイスビルダエクスペリエンスをさらに強化できます。これはInterface Builder内のコネクタを使用して相互に接続することができます。

基礎となるのUIViewControllerは唯一の「マイクロコントローラ」委任パターンを満たすのに十分な機能を実装する必要があります。

あなたは既に、クラス名を変更し、ペン先の負荷を処理することにより、カスタムビューを追加するための詳細情報を持っています。 「マイクロコントローラ」(使用されている場合)は、NSObject派生クラスadded to the NIB as suggested hereであることができます。私は孤立場合にこれらの手順のすべてをやったが、

、私はすべての方法正式なソリューションのこの種にそれを取られたことがありませんが、いくつかの計画と、それはかなり信頼性の高い堅牢なする必要があります。

関連する問題