私は通常、カスタム ビューをプログラムで作成し、カスタムの init メソッド (initWithFrame:SomeParam:OtherParam など) を使用してプログラムで初期化することを意図しています。このようなカスタム ビューを xib ファイルと組み合わせて使用することは可能ですか? つまり、これらのサブビューが異なる init メソッドを使用する必要がある可能性があるサブビューとして、これらのカスタム ビューのさまざまな親 xib ファイルを持っていますか?
4 に答える
カスタム ビューを xib ファイルに追加する場合、カスタム初期化子は使用できません。それらはすべて を使用して初期化されますinitWithCoder
。
通常、そこから呼び出される共通のメソッド、または でセットアップを行いますawakeFromNib
。
ビューの外部から発生したカスタム プロパティをビューに設定する必要がある場合viewDidLoad
は、View Controller で行います。
ビューの xib を通常の方法で初期化し、参照を使用してカスタム設定を行います。この部分は、次のように init メソッドに入れることができます-
-(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 を使用する場合、xib
ユーティリティ関数は初期化されたオブジェクト (のUIView
) を返します。オブジェクトを取得した後UIView
、初期化されたオブジェクトを通常のオブジェクトとして使用して、さらにカスタムの変更を加えることができます。
もちろん可能です。デフォルトビュー内ではなく、xib に uiview をドラッグします。次に、を作成し、IBOutlet UIView *myCustomView;
それを他のビューに接続します。このビューを表示し[self.view addSubview:myCustomView];
たいときは、削除したいときにこれを追加します
[myCustomView removeFromSuperView];
UINib (iOS) および NSNib (OS X) クラスは、nib ファイルの内容の複数のコピーを作成する必要がある場合に、より優れたパフォーマンスを提供します。通常の nib ロード プロセスでは、ディスクから nib ファイルを読み取り、そこに含まれるオブジェクトをインスタンス化します。ただし、UINib および NSNib クラスでは、nib ファイルがディスクから一度読み取られ、その内容がメモリに格納されます。それらはメモリ内にあるため、ディスクにアクセスする必要がないため、オブジェクトの連続するセットを作成するのにかかる時間が短くなります。
- 1 ビューの xib ファイルを作成します。プロジェクトを右クリック -> 新しいファイル -> ユーザー インターフェイス -> ビュー (たとえば、"MyView.xib" が作成されます)
- Interface Builder を使用してビューを埋める
親コンポーネントに次のメソッドを追加します
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]; }
次のコード行を使用して、再利用可能な nib オブジェクトでビューをインスタンス化します。
UIView *item = [self createNewViewFromNib:@"MyView"]; // [self.view addSubview:item];