LoginSignup
44
45

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-03-10

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

XiBのClass指定はViewに対してではなくOnwerにつける

ここでポイント1。
XiB側の方のCustom Classの設定をViewではなく、Ownerの方につけます。
スクリーンショット 2015-03-10 23.06.15.png

initWithCoderでXiBで生成したViewを差し込む

ポイント2。
ここが最重要の肝です。


-(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

結果

うまくIncludeされました!

スクリーンショット 2015-03-11 0.07.17.png

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

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

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

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

@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

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

スクリーンショット 2015-03-11 0.06.33.png

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

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

appwchr post

API開発の効率化の架け橋!APIのStubサーバーを導入して,API開発に効率化、スピード化、柔軟性を手に入れよう!

アプリエンジニアから見てAPI設計において気をつけてもらえるとうれしいこと

Goodbye... Jenkins... Jenkinsを卒業してお手軽CI! iOSもAndroidもCircle CIでアプリのCIを回そう

まだTestFlight使ってたの?急げ!終了目前のTestFlightから,今すぐにiOSもDeployGateに移行しよう!移行パターンも紹介するよ。

Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料

iOSの開発をする上で絶対に使うべき!外せない!webサービス、開発ツール集【完全版】

注目のiBeacomなどの波に乗り遅れないために!iOSのBluetooth開発を容易にするライブラリを書きました。

まだまだあった!iOSの開発を劇的に改善する最新のwebサービス、開発ツール集1

さらに快適なアプリ開発を!iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2

スパゲッティから脱出!iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介

44
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
45