iOSだってincludeしたい！！ iOSでもwebやAndroidのようにstoryboardへXiBをIncludeする

by @mixiappwchr



サーバーサイドを書いたことある人がiOS開発をやると、一回は考えたことがあるかと思うのが,stoaryboardにwebのテンプレートエンジンみたいにincludeして別のViewを差し込みたい！というやつです。
他のXiBやstoryboardをコード側で読み込んだり,Container Viewを使えば近いことはできるのですが、今日は別の方法をふと知ったのでご紹介します。


# initWithCoder

今回はIncludeViewというxibで生成されたViewをstoryboardにincludeしてみます。全くCodeゼロではありませんが、差し込み先でのIncludeの部分はInterfaceBuilder Onlyです。


## 普通にViewとXibを作ります。

こんな感じのやつです。
![スクリーンショット 2015-03-10 23.18.20.png](https://qiita-image-store.s3.amazonaws.com/0/37731/f95dceab-ceb1-ce37-0d5a-fac3e4851a96.png)



## XiBのClass指定はViewに対してではなくOnwerにつける
ここでポイント１。
XiB側の方のCustom Classの設定をViewではなく、Ownerの方につけます。
![スクリーンショット 2015-03-10 23.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/37731/46c284fa-d073-95f1-9f21-06a9b6e1e4eb.png)



## initWithCoderでXiBで生成したViewを差し込む
ポイント２。
ここが最重要の肝です。

```objc

-(id)initWithCoder:(NSCoder *)aDecoder{
	if ((self = [super initWithCoder:aDecoder])){
		[self addSubview:
		 [[[NSBundle mainBundle] loadNibNamed:@"IncludeView"
										owner:self
									  options:nil] objectAtIndex:0]];
	}
	return self;
}
```

storyboardなどで作成したViewはinitWithCoderが呼ばれますが、ここでXiBから生成したViewを自分自身をOwnerにしてadd subViewします！

そういえばこうすると、AndroidのCustomViewの作り方に近いですね。

# Includeしたい側のStoryboardでは

普通にViewを配置してCustom Classを配置します。
好きなだけ配置します。

![スクリーンショット 2015-03-10 23.08.16.png](https://qiita-image-store.s3.amazonaws.com/0/37731/d7556450-6d44-0b39-3ab7-30cdb195028e.png)

# 結果

うまくIncludeされました！

![スクリーンショット 2015-03-11 0.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/37731/418d6325-553b-b14a-41af-2ebc6184c715.png)


呼び出し側ではコードは一切書いてませんね！
IBDesignbleが効けば完璧なのですがまあ贅沢は言いません。

今まで場面によっては地味にXiBにしたいけど、コードのみで書いていたりしたので、選択肢が増えて嬉しい限りです。


# 発展系 : IncludeするXiBを好きに切り替える

ちょっとコードを修正してstoryboardからIncludeするXiBを変えてみましょう

```objc
@interface IncludeView ()
@property(nonatomic) NSString *templateName;
@end

@implementation IncludeView


-(void)awakeFromNib{
	if(self.templateName){
		[self addSubview:
			 [[[NSBundle mainBundle] loadNibNamed:self.templateName
											owner:self
										  options:nil] objectAtIndex:0]];
	}
}

```
要はあとからXiBを差し込めばいいのでちょっとだけ処理を遅延させて,storyboardからパラメータを受け取ることができるawakeFromNibまで遅延させてViewを差し込みます。そして差し込むXiBを

![スクリーンショット 2015-03-11 0.06.13.png](https://qiita-image-store.s3.amazonaws.com/0/37731/0c008142-6db2-7f96-f484-6ae099c641d7.png)


このようにstoryboard側から指定してあげると


![スクリーンショット 2015-03-11 0.06.33.png](https://qiita-image-store.s3.amazonaws.com/0/37731/a7585ab1-aa6c-bfa4-b873-64c9c4ff0f63.png)


うまく切り替えることができましたね！

Viewの扱いの柔軟に扱うための一つの選択肢としておぼえてもらえれば。


##### appwchr post
----

[API開発の効率化の架け橋！APIのStubサーバーを導入して,API開発に効率化、スピード化、柔軟性を手に入れよう！](http://qiita.com/appwatcher/items/49807e72d9600db7196d)

[アプリエンジニアから見てAPI設計において気をつけてもらえるとうれしいこと](http://qiita.com/appwatcher/items/4a0dd09c393cc70d961a)

[Goodbye... Jenkins... Jenkinsを卒業してお手軽CI! iOSもAndroidもCircle CIでアプリのCIを回そう](http://qiita.com/appwatcher/items/4cdf39804d6e46ab7af5)

[まだTestFlight使ってたの？急げ！終了目前のTestFlightから,今すぐにiOSもDeployGateに移行しよう！移行パターンも紹介するよ。](http://qiita.com/appwatcher/items/632460e15fbdb81b7a71)

[Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料](http://qiita.com/appwatcher/items/50295e82ab0095902aaa)

[iOSの開発をする上で絶対に使うべき！外せない！webサービス、開発ツール集【完全版】](http://qiita.com/appwatcher/items/07a3babcb9b6cefb307e)

[注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)

[まだまだあった！iOSの開発を劇的に改善する最新のwebサービス、開発ツール集１]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)

[さらに快適なアプリ開発を！iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)

[スパゲッティから脱出！iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)