0
0

More than 1 year has passed since last update.

[iOS]カスタムUIView研究

Last updated at Posted at 2021-12-13

こちら 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から該当のクラスを見つけられず、上手く呼ばれないケースがあったため注意しよう。

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