init(frame:), init(coder:), awakeFromNib, prepareForInterfaceBuilder が呼ばれる条件をまとめてみた

公開日: : iOSアプリ開発

カスタム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:)
  • Interface Builder上でIBDesignableなViewとして動かした時
    • prepareForInterfaceBuilder

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

【RxSwift】BehaviorRelayとPublishRelayについてまとめてみた

こんにちは、@akio0911です。今回はRxSwiftのBe

【RxSwift】materialize, dematealizeを使ってみた

@toshi0383さんに教えていただいた、RxSwiftのm

【RxSwift】ストリームのcompletedをつぶす(消し去る)方法

RxSwiftで元々のストリームからcompletedをつぶす

【RxSwift】completedかerrorが流れてきたらsubscribeはdisposeされる

RxSwiftにおいて、completedかerrorが流れて

init(frame:), init(coder:), awakeFromNib, prepareForInterfaceBuilder が呼ばれる条件をまとめてみた

カスタムViewを作った際に呼ばれる初期化系メソッドの条件や順

→もっと見る

PAGE TOP ↑