MD Blog

誰かの何かに役に立てることを書いていきたいです

[iOS] xibファイルで作成したviewを、storyboardに配置する方法

複数のstoryboard上で共通したカスタムviewを使いたいとき、それぞれのstoryboardで同じ画面を設計するのは面倒なので、カスタムviewを1つのxibファイルで設計してそれを使いまわしたいことがあると思います。

その場合、xibファイルで作成したviewをstoryboardに直接配置できると便利なのですが、これをするには少し工夫が必要です。

viewクラスからxibファイルを読み込む

クラスファイルに以下を記述します。

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        if (!self.subviews.count) {
            UIView *subview = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil][0];
            subview.frame = self.bounds;
            [self addSubview:subview];
        }
    }
    return self;
}

storyboardからviewクラスを読み込むとinitWithCoderメソッドが呼ばれます。 initWithCoderメソッドの中でxibファイルを読み込もうとすると、再びinitWithCoderメソッドが呼ばれてしまい循環参照になってしまいます。 これを回避するために一工夫が必要になります。

※xib上で、読み込むviewの上に何かを配置しておく必要があります。 何も配置しないと、 if (!self.subviews.count) の判定を通ってしまい無限ループします。

storyboardにviewを配置する

storyboard上でUIViewを配置します。 そのUIViewのClassを上記のviewクラスに指定します。

References

objective c - Infinite loop when overriding initWithCoder - Stack Overflow