2012-06-13 18 views
10

私は通常、カスタムビューをプログラム的に作成し、独自のinitメソッド(例:initWithFrame:SomeParam:OtherParam)でプログラム的に初期化することを意図しています。そのようなカスタムビューをxibファイルと組み合わせて使用​​することは可能ですか?つまり、これらのカスタムビューのさまざまなサブビューとして、これらのサブビューが異なるinitメソッドを使用する必要があるかもしれない親ビューのxibファイルがありますか?xibファイルのiOSカスタムビュー

答えて

10

、カスタム初期化子を使用することはできません削除したい場合は、このビューは[self.view addSubview:myCustomView];としてこれを追加します。それらはすべてinitWithCoderを使用して初期化されます。

一般的には、そこから呼び出される共通の方法で、またはawakeFromNibに任意の設定を行います。

外部からのビューのカスタムプロパティを設定する必要がある場合は、ビューコントローラのviewDidLoadで行います。

+0

ビューコントローラのviewDidLoadの前にsthを実行する必要がある場合は、それ ?私の見解は、本の1ページを表示するために使用されます。initWithPage:pageなどのカスタムinitメソッドがなければ、同時にストーリーボードも使用します。 – Carina

+1

viewDidLoadの前に、ビューは存在しません。 initWithで行った設定を別のメソッドに移動し、プロパティを設定した後に必要な変更を行います。 – jrturton

3

もちろん可能です。既定のビューの内部ではなく、xib内のuiviewをドラッグします。 IBOutlet UIView *myCustomView;を作成してから、もう一方のビューに接続します。 uは表示したいときにXIBファイルにカスタムビューを追加する場合、それは

[myCustomView removeFromSuperView];

enter image description here

+0

だから、initWithSomeValue:value関数についてはどうですか? – Carina

+0

これは、複数のXIBファイルにまたがってカスタムヘッダービューを共有したい場合には機能しません...各xibで正確に再定義する必要があります – LightningStryk

6

通常の方法でビューのxibを初期化し、参照を使用してカスタム設定を行います。我々は、明示的に初期化しないXIBを使用する場合1を取得した後、this-

 -(void)initfunction{ 
     UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"myView" owner:self options:nil] lastObject]; 
     containerView.property1 = xyz;//Customization 
     containerView.property2= abc;//Customization 
     containerView.frame = CGRectMake(x,y,z,p);//Customization 
     [rootView addSubview:containerView]; 


    } 

ポイントは、xibユーティリティ関数は、(UIViewの)初期化されたオブジェクトを返しているように、この部分は、initメソッドに入れることができますUIViewオブジェクトの場合、初期化されたオブジェクトを単なる通常のオブジェクトとして使用して、さらにカスタムの変更を加えることができます。

0

nibファイルのコンテンツの複数のコピーを作成したい場合は、UINib(iOS)クラスとNSNib(OS X)クラスが優れたパフォーマンスを発揮します。通常のnibローディングプロセスでは、ディスクからnibファイルを読み込み、それに含まれるオブジェクトをインスタンス化します。しかし、UINibとNSNibクラスでは、nibファイルはディスクから一度読み込まれ、内容はメモリに格納されます。それらはメモリに格納されているため、ディスクにアクセスする必要がないため、連続したオブジェクトセットの作成に要する時間が短くなります。

  1. 1ビューXIBファイルを作成します。プロジェクトを右クリック - インターフェイスBuilderを使用してビューを塗りつぶし>表示(例:あなたは「MyV​​iew.xib」を持つことになります)
  2. - >新規ファイル] - > [ユーザーインターフェイス
  3. あなたの隣にメソッドを追加し、親コンポーネント

    static UINib *nib = nil; 
    
    - (UIView*)createNewViewFromNib: (NSString *)nibFileName 
    { 
        if(nib == nil) { 
         nib = [UINib nibWithNibName:nibFileName bundle:nil ]; 
        } 
    
        // Unarchiving objects from the nib. You can do it multiple times to create a number of objects from same nib. 
        NSArray* topLevelObjs = [nib instantiateWithOwner:self options:nil]; 
    
        if (topLevelObjs == nil) 
        { 
         NSLog(@"Warning! Could not load nib file.\n"); 
         return nil; 
        } 
        // We have only one view in the nib. 
        return [topLevelObjs objectAtIndex:0]; 
    } 
    
  4. 使用しますが、再利用可能なペン先のオブジェクトに表示インスタンス化するためのコードの次の行:

    UIView *item = [self createNewViewFromNib:@"MyView"]; 
    // [self.view addSubview:item]; 
    
関連する問題