init(frame:), init(coder:), awakeFromNib, prepareForInterfaceBuilder が呼ばれる条件をまとめてみた
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
カスタムViewを作った際に呼ばれる初期化系メソッドの条件や順番について調べてみました。
検証に使うコード
今回は以下のコードを検証に使用しました。
import UIKit @IBDesignable final class CustomView: UIView { override init(frame: CGRect) { print(#function) super.init(frame: frame) backgroundColor = UIColor.red } required init?(coder aDecoder: NSCoder) { print(#function) super.init(coder: aDecoder) backgroundColor = UIColor.green } override func awakeFromNib() { print(#function) super.awakeFromNib() backgroundColor = UIColor.cyan } override func prepareForInterfaceBuilder() { print(#function) super.prepareForInterfaceBuilder() backgroundColor = UIColor.blue } }
アプリ実行時(Interface Builderで生成した場合)
以下のようなコンソール出力が行われることから、init(coder:)の次にawakeFromNib()が呼ばれることが分かります。
init(coder:)
awakeFromNib()
アプリ実行時(コードで生成した場合)
ViewControllerのviewDidLoadに以下のようなコードを記述し、カスタムViewの生成を行います。
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let customView = CustomView(frame: CGRect.zero) view.addSubview(customView) } }
アプリ実行時に以下のようなコンソール出力が行われることから、init(frame:)のみが呼ばれることが分かります。
init(frame:)
Interface Builder上でIBDesignableなViewとして動かした時
Interface Builder上での動作時にはprintの内容がコンソールに出力されないことから、viewのbackgroundColorを変更するコードを使って検証しています。
カスタムViewの色が青くなることから、prepareForInterfaceBuilderが呼ばれていることが分かります。
また、以下のコードをコメントアウトした場合はカスタムViewの色が初期状態から変化しないことから、prepareForInterfaceBuilderのみが呼ばれていることが分かります。
override func prepareForInterfaceBuilder() { print(#function) super.prepareForInterfaceBuilder() backgroundColor = UIColor.blue }
まとめ
- アプリ実行時
- カスタムViewをIBで生成した場合
- init(coder:)
- awakeFromNib()
- カスタムViewをコードで生成した場合
- init(frame:)
- カスタムViewをIBで生成した場合
- Interface Builder上でIBDesignableなViewとして動かした時
- prepareForInterfaceBuilder
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!