2011-02-05 7 views
4

再利用性の高い値を持つかなり汎用的なUIViewオブジェクトであることを考えると、複数のView Controllerで再利用したいUIViewがあるとします(UITextFieldまたはUISegmentedControlオブジェクト)。 Interface Builderを使用してXIBを作成するのではなく、UIViewをコードで記述した場合、このUIViewを再利用するほうがずっと簡単です。私はUIViewのは、コードで書かれているならば、私は単純に任意のビューコントローラのそれのUIViewの新しいインスタンスを初期化することができますので、この結論に達した:コードベースのUIViewをXIBと比較して再利用

MyGreatReusableView *greatReusableView = [[MyGreatReusableView alloc] initWithFrame:CGRectMake(...)]; 

...そして直接そのUIViewの特性や属性にアクセスなどのストックUIViewコントロールのように、.text.textColorなどのプロパティがあります。

ただし、UIViewをXIBとして作成する場合は、XIBのViewオブジェクトのFile所有者またはIBOutletのいずれかを介して特定のView Controllerに接続する必要があります。そのため、ビューコントローラ。さらに、そのビューコントローラに接続されているIBOutletを使用して、XIBのコントロールのプロパティにのみアクセスできます。

私はXIBファイルに関して何かを完全に誤解していると思っています。これはかなり制限されているようです。誰かが複数のView ControllerでXIBファイルを再利用できるかどうかを明確にすることができれば、コードベースのソリューションとXIBベースのソリューションの例を提供することができます。

ありがとうございました!

答えて

1

実際、複数のビューコントローラで同じビューを使用することは可能です。あなたは正しい軌道に乗っていた。重要な点は、ビューが結ばれているビューコントローラを使用する必要がないことです。ここで私は(スライダーのようなものを含んで)再利用可能なテーブルセル

  1. は、新しいビューを作成して新しいXIBファイルを作成します(私の場合には、これはしたテーブルセル)
  2. 設定のために何をすべきかであります
     
    
    @implementation TableCellFactory 
    +(UITableViewCell*) createCellInstanceFromXIBName:(NSString*)name { 
         UIViewController* tmp = [[UIViewController alloc] initWithNibName:name bundle:nil]; 
         UITableViewCell* cell = (UITableViewCell*)[tmp view]; 
         DebugAssert([[cell class] isSubclassOfClass:[UITableViewCell class]], @"XIB view cell is not a subclass of UITableViewCell; xib name:%@",name); 
         DebugAssert(cell != nil,@"cell is nil -- Xib name:%@",name); 
         [cell retain]; 
         [tmp release]; 
         return cell; 
    } 
    @end 
     
    
+0

あなたのメッセージをありがとうございます。ビューコントローラを作成していて、そのコントローラのビューコンセントをあなたのXIBビューに設定するだけで、コード内のビューコントローラの.viewプロパティにアクセスできます。言い換えれば、ビューコントローラ自体は何もしませんか?私はちょうどこれが非常にエレガントで効率的な解決策ではないように思えます。コードでUIViewを作成すると、UIViewControllerを使用する必要がなくなり、UIViewを直接初期化できます。 – Skoota

+0

これは正しいです。私は最小の非効率性のために睡眠を失うことはありません - それは最適化が必要な厳しいコードパスではありません(私のコードでは、少なくとも)。私はこれもAppleが推奨する方法だと考えています。 – MrAnonymous

2

代替ソリューション:UIViewController.viewは(再び、表のセル)

  • Iは、(現在の製造に使用される)は、このコードでそれをフックアップビューであることが再利用可能なビューのIBOutletsを設定する必要はなく、特定のタグで使用するサブビューを割り当てることができます。その後、タグを使ってビューを取得することができました。

    たとえば、ラベルとテキストフィールドを含むビューを作成する場合です。これを実行するためのプロセスは次のようになります。

    1. 空のXIB
    2. セットアップにサブビューとしてラベルとテキストフィールドを持つビューを作成します。
    3. このXIBのヘッダファイルを作成し、タグ
      #define kReusableViewNibName @"ReusableViewNibName"
      #define kLabelTag 10
      #define kTextFieldTag 11

    4. のためのマクロを定義

    5. (のは、10と11をしましょう)ラベルとテキストフィールド異なるタグを割り当てます

    6. xibをロードしたい任意のビューコントローラでxibをロードできるようになりました:

  • 関連する問題