Edited at

意外と知られていないxibのこと

More than 1 year has passed since last update.

意外と知られていない? 使われていない? xibの解説です。やっぱりUI関連はxib(Storyboard)がとても便利です。


コードから読み込み

NibTest.xcodeproj_—_Objects.xib-2.png

これをこのように読み込みます。

- (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の接続はできます

NibTest.xcodeproj_—_Objects.xib.png

Classの設定は、Files Ownerとして与えられる予定のクラスが何でAction/Outletで何が接続できるかを判断するためのものとなります。

NibTest.xcodeproj_—_Objects.xib.png

Attributesには何もでません。

コードで指定する時はこうなります。

- (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いいですよ。