[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