意外と知られていない? 使われていない? xibの解説です。やっぱりUI関連はxib(Storyboard)がとても便利です。
コードから読み込み
これをこのように読み込みます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UINib *objectsNib =[UINib nibWithNibName:@"Objects" bundle:nil];
NSArray *objects = [objectsNib instantiateWithOwner:nil options:nil];
NSLog(@"%@", objects);
// NSBundleから読み込むほうが簡単
NSLog(@"%@", [[NSBundle mainBundle] loadNibNamed:@"Objects" owner:nil options:nil]);
return YES;
}
2017-06-20 追記
上記パフォーマンスの観点から UINib
がいいとコメントいただきました。
ありがとうございます🙏
instantiateWithOwner:options:
の戻り値はxibのObjectsの内容です。
xibを読み込むとObjectsが取得できます。(Objectsはクラスではなくインスタンス)
更に同時に以下の様なことも行われます。
-
Attributes Inspectorで指定した値等の設定
実際にはsetProperty:
されるのではなくinitWithCoder:
でオブジェクトが読み込まれているようです。xibはインスタンスをシリアライズしたものを保存しているんですねきっと。 -
Action/Outletの接続
オブジェクトのシリアライズだけでは表現できない、他のオブジェクトとの関連も設定してくれます。 -
UIViewの構造の生成
addSubview:やsetFrame:、それにAutoLayout関連の設定等も行ってくれます。
Files Owner
Files Ownerとは、xibで生成されず、外部から与えられます。外部から与えられますので Attributes Inspectorで設定することはできません。
しかし Action/Outletの接続はできます
Classの設定は、Files Ownerとして与えられる予定のクラスが何でAction/Outletで何が接続できるかを判断するためのものとなります。
コードで指定する時はこうなります。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UIViewController *controller = [[UIViewController alloc] init];
UINib *objectsNib =[UINib nibWithNibName:@"Objects" bundle:nil];
NSArray *objects = [objectsNib instantiateWithOwner:controller options:nil];
NSLog(@"%@", objects);
return YES;
}
initWithNibName:bundle:
UIViewControllerでxibを使う場合が多いと思いますが、initWithNibName:bundle:
は 自身をOwnerとしてxibを読み込み初期化する メソッドとなります。
xibの読み込みにUIViewControllerは不要
通常xibを使うのはUIViewControllerの生成に関連する部分が多いため、UIViewControllerが必須と思っている方もいらっしゃるかもしれません。ですが上記のようにそれが必要なわけではありません。
setFrame:
やsetBackgroundColor:
等のviewの組み立てコードを外に追い出し、addTarget:action:forControlEvents:
のようなコードも追い出して、xibをロードするだけで全て済んだカスタムビューを取り出すといったことができます。
最近はnibをUITableViewに設定すると自動でそれを使ってくれるなど色々便利で、直接xibを読み込むことは少なくなったのですが…知っていれば役に立つ場面もまだあると思います。
その他
Storyboardはxibの集合と、xib同士の関連をひとまとめにしたものです。Storyboardを複数作って云々…という手もありますが、ちょっとした部品をメインのStoryboardとは別に作りたいならxibいいですよ。