こちら https://qiita.com/maebaru/items/90f915f82e3d6425cbdc のやり方だが、カスタムビューを他のstoryboardから生成するとエラーになる。
init coder -> loadNib -> CustomView.xibを見に行く -> CustomView.xib上のViewがCustomViewクラスに設定されている -> init coder...という無限ループになってしまう。
CustomView.xibで、カスタムクラスとして設定するのをやめると上手く行くようだった。
https://tellusium.hatenablog.com/entry/2018/09/30/183523
files ownerとはxibをロードするクラスで、ibOutletなどを設定するクラスのことを意味する。通常ViewControllerはこれに当たる。UIViewでも、xib上のibOutletを受け取りたい時は、そのクラスをfiles ownerに設定すべきと考えられる。
https://stackoverflow.com/questions/15251370/what-is-the-files-owner-in-interface-builder
ただfiles ownerとして設定した場合はViewとしてクラスに紐付いていないため、そのカスタムViewのnibファイルをインスタンス化しても、init?(coder aDecoder: NSCoder)とawakeFromNibが呼ばれないようである。nibインスタンスから取得できるのはただのUIViewである。カスタムViewクラスのイニシャライザ内で、このUIViewを取り出し、自分にaddsubviewしていくことになる。
一方、カスタムクラスとして設定してもibOutletは受け取れる。
https://qiita.com/marty-suzuki/items/7c7ecdcb1f16c21b0051#2-xibのfiles-ownerをクラスに紐付ける
カスタムクラスとしてCustomViewクラスを設定した場合、CustomView.xibを指すnibインスタンスを生成し、そこからCustomViewクラスのインスタンスを直接取り出して使うことができる。
nibが初期化された段階でそのクラスのinit from coderとawakeFromNib関数がよばれるので、そこで何か必要なUIのセットアップなどをすることができる。ただ、何か必要な値を外からinitializerへ渡すことはできないので、初期化が終わった後に注入していくしかないと思われる。
注意
カスタムクラス・Files Ownerとして何かのクラスを設定する場合、Module
の欄が空だとうまく特定できない場合があるため、inherit Module From Targetにチェックを入れるなどしよう。
なおCustomViewクラスをprivateにしていると、xibから該当のクラスを見つけられず、上手く呼ばれないケースがあったため注意しよう。