一つのViewControllerが表示される時、実は裏で様々なメソッドが動いています。
それらについて書いていきます。
画面を表示する時
画面を離れる時
画面遷移する際は、以下のような順番で呼ばれます。
画面遷移元:FirstViewController
画面遷移先:SecondViewController
クラス名:FirstViewController メソッド名:viewDidLoad()
クラス名:FirstViewController メソッド名:viewWillAppear
クラス名:FirstViewController メソッド名:viewWillLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidLayoutSubviews()
クラス名:FirstViewController メソッド名:viewWillLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidAppear
画面遷移します ←ここでボタンが押された
クラス名:SecondViewController メソッド名:viewDidLoad()
クラス名:FirstViewController メソッド名:viewWillDisappear
クラス名:SecondViewController メソッド名:viewWillAppear
クラス名:SecondViewController メソッド名:viewWillLayoutSubviews()
クラス名:SecondViewController メソッド名:viewDidLayoutSubviews()
クラス名:FirstViewController メソッド名:viewWillLayoutSubviews()
クラス名:FirstViewController メソッド名:viewDidLayoutSubviews()
クラス名:SecondViewController メソッド名:viewDidAppear
クラス名:FirstViewController メソッド名:viewDidDisappear
注意すべきは、画面遷移の処理が開始した後もFirstViewControllerメソッドが呼ばれているという点です。
サンプルコード
サンプルコード
※storyboardの設定がコードから推測してみてください。詳しくはSegueの部分にて。
画面遷移元
import UIKit
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
print("クラス名:\(String(describing: FirstViewController.self))\tメソッド名:\(#function)");
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("クラス名:\(String(describing: FirstViewController.self))\tメソッド名:\(#function)");
}
override func viewWillLayoutSubviews() {
print("クラス名:\(String(describing: FirstViewController.self))\tメソッド名:\(#function)");
}
override func viewDidLayoutSubviews() {
print("クラス名:\(String(describing: FirstViewController.self))\tメソッド名:\(#function)");
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("クラス名:\(String(describing: FirstViewController.self))\tメソッド名:\(#function)");
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("クラス名:\(String(describing: FirstViewController.self))\tメソッド名:\(#function)");
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("クラス名:\(String(describing: FirstViewController.self))\tメソッド名:\(#function)");
}
func segueToSecondViewController() {
self.performSegue(withIdentifier: "transitionSegue", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "transitionSegue" {
print("画面遷移します")
}
}
}
画面遷移先
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print("クラス名:\(String(describing: SecondViewController.self))\tメソッド名:\(#function)");
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("クラス名:\(String(describing: SecondViewController.self))\tメソッド名:\(#function)");
}
override func viewWillLayoutSubviews() {
print("クラス名:\(String(describing: SecondViewController.self))\tメソッド名:\(#function)");
}
override func viewDidLayoutSubviews() {
print("クラス名:\(String(describing: SecondViewController.self))\tメソッド名:\(#function)");
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("クラス名:\(String(describing: SecondViewController.self))\tメソッド名:\(#function)");
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("クラス名:\(String(describing: SecondViewController.self))\tメソッド名:\(#function)");
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("クラス名:\(String(describing: SecondViewController.self))\tメソッド名:\(#function)");
}
}
それでは具体的にどういうものか一つずつ見ていきましょう。
loadView
基本的にこのメソッドは呼ばないです。
初期化を行いたいなら、むしろviewDidLoadメソッドでやった方がいいでしょう。
原文
原文
You should never call this method directly. The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property.
If the view controller has an associated nib file, this method loads the view from the nib file. A view controller has an associated nib file if the nibName property returns a non-nil value, which occurs if the view controller was instantiated from a storyboard, if you explicitly assigned it a nib file using the init(nibName:bundle:) method, or if iOS finds a nib file in the app bundle with a name based on the view controller’s class name. If the view controller does not have an associated nib file, this method creates a plain UIView object instead.
If you use Interface Builder to create your views and initialize the view controller, you must not override this method.
You can override this method in order to create your views manually. If you choose to do so, assign the root view of your view hierarchy to the view property. The views you create should be unique instances and should not be shared with any other view controller object. Your custom implementation of this method should not call super.
If you want to perform any additional initialization of your views, do so in the viewDidLoad() method.
和訳
和訳
このメソッドは直接呼び出してはならない。
ViewControllerのプロパティが要求されたときにViewControllerがこのメソッドを呼ぶが、現在はnilだ。
このメソッドはviewをロード、もしくはビューのプロパティにviewその割り当てをプロパティにする。
ViewControllerがnibファイルと結びついていたら、このメソッドはビューをnibファイルからロードする。
viewControllerがnibファイルを結びつける、もしnib名のプロパティがnilでない値を返すなら、そしてそれが次の子とを引き起こすなら、もしstoryboardからインスタンス化されたなら、もし明示的にそれにinit(nibName:bundle:) メソッドを使用しているnibファイルを割り当てているなら、またはiOSが nibファイルを見つけたなら、viewControllerのクラス名がついたビューに基づいた名前のアプリのバンドルの中の。
もしviewControllerがnibファイルとの紐付けられていないなら、このメソッドは代わりにただのUIViewのオブジェクトを作る。
もしviewやviewcontrollerを初期化するためにIBを作るなら、このメソッドをオーバーライドしてはいけない。
ビューを手動ででつくる前にこのメソッドオーバーライドすることはいい。
もしそうするなら、rootviewの階層に割り当てる。viewのプロパティに。
作ったviewは一つだけのインスタンスであるべきで、他のviewcontrollerのオブジェクトと共有すべきではない。
実装においてはスーパークラスを呼ぶべきでない。
作ったviewの初期化を行いたいなら、viewDidLoadメソッドの中でそうする方がいい。
viewDidLoad
自分でviewを作る時、初期化時に追加の修正を入れる時に使います。
まあ、ViewControllerクラスを作成した時にコメントがあるので、その方が役割はわかりやすいです。
// Do any additional setup after loading the view, typically from a nib.
和訳:一般的に、nibからビューをロードした後、追加の設定をする。
原文
原文
This method is called after the view controller has loaded its view hierarchy into memory. This method is called regardless of whether the view hierarchy was loaded from a nib file or created programmatically in the loadView() method. You usually override this method to perform additional initialization on views that were loaded from nib files.
和訳
和訳
viewDidloadメソッドはviewControllerがビュー階層をメモリ上へロードした後に呼ばれる。
例え、ビュー階層がnibファイルからロードされようとコードによって作られようと、loadViewメソッド内で呼ばれる。
nibファイルからロードしたビュー上で追加の初期化をするときにこのメソッドをオーバーライドする。
viewWillAppear
このメソッドは画面が表示される直前に呼ばれるメソッドです。
ステータスバーなどの編集をするときはこのメソッド内で行います。
そして、このメソッド内では以下のコードを書いてスーパークラスのviewWillAppearメソッドを呼ぶ必要があります。
super.viewWillAppear(animated)
原文
原文
This method is called before the view controller’s view is about to be added to a view hierarchy and before any animations are configured for showing the view. You can override this method to perform custom tasks associated with displaying the view. For example, you might use this method to change the orientation or style of the status bar to coordinate with the orientation or style of the view being presented. If you override this method, you must call super at some point in your implementation.
For more information about the how views are added to view hierarchies by a view controller, and the sequence of messages that occur, see Supporting Accessibility.
和訳
和訳
このメソッドはviewControllerのビューがビュー階層に追加される前に呼ばれ、ビューを見せるためのアニメーションの設定をする。
ビューの表示に紐づいた独自のタスクを行うためにこのメソッドをオーバーライドできる。
例えば、このメソッドを使うかもしれない。方針やステータスバーのスタイルを
もしこのメソッドをオーバーライドしたら、実装のどこかでスーパークラスのこのメソッドを呼ばなければならない。
どうやってviewcontrollerによってビュー階層に加わったか、発生したシーケンスのメッセージについてのさらに詳しい情報については、Supporting Accessibilityを見るといい。
viewWillLayoutSubviews
原文
原文
When a view’s bounds change, the view adjusts the position of its subviews. Your view controller can override this method to make changes before the view lays out its subviews. The default implementation of this method does nothing.
和訳
和訳
ビューのboundsが変わる時、そのviewのsubviewの位置を調整する。
viewControllerはこのメソッドをオーバーライドできる、ビューがsubviewをレイアウトする前に変更するために。
デフォルトではこのメソッドは何もしない。
viewDidLayoutSubviews
原文
原文
When the bounds change for a view controller’s view, the view adjusts the positions of its subviews and then the system calls this method. However, this method being called does not indicate that the individual layouts of the view’s subviews have been adjusted. Each subview is responsible for adjusting its own layout.
Your view controller can override this method to make changes after the view lays out its subviews. The default implementation of this method does nothing.
和訳
和訳
boundがViewControllerのビューを崩す時、viewがその寒ビューの位置を調整し、システムがこのメソッドを呼ぶ。
しかし、このメソッドが呼ばれることは示すということではない。ここのビューのサブビューのレイアウトが調整されるということを。
それぞれのサブビューはそれぞれ自分のサブビューの調整を担当している
作成したviewcontrollerはviewのサブビューの配置をした後に変更をかけるためにオーバーライドされる。
デフォルトの実装ではこのメソッドは何もしない。
viewDidAppear
このメソッドはビューが表示された後に呼ばれます。
ビューが表示された後なので、ここでレイアウトを編集のは混乱の元になります。
原文
原文
You can override this method to perform additional tasks associated with presenting the view. If you override this method, you must call super at some point in your implementation.
和訳
和訳
このメソッドを現在のビューにタスクの追加を行う時にオーバーライドできる。
このメソッドをオーバーライドするときは、実装のどこかにスーパーメソッドを呼ぶ必要がある。
viewDisappear
画面遷移などで画面が表示されなくなる直前に呼ばれるメソッドです。
UINavigationViewControllerやUITabBarViewControllerなどにViewControllerのオブジェクトが残っている場合は、ViewControllerは破棄されないので気をつけてください。
原文
原文
You can override this method to perform additional tasks associated with presenting the view. If you override this method, you must call super at some point in your implementation.
和訳
和訳
このメソッドを現在のビューにタスクの追加を行う時にオーバーライドできる。
このメソッドをオーバーライドするときは、実装のどこかにスーパーメソッドを呼ぶ必要がある。
viewDidDisappear
画面遷移などで画面が表示されなくなった後に呼ばれるメソッドです。
UINavigationViewControllerやUITabBarViewControllerなどにViewControllerのオブジェクトが残っている場合は、ViewControllerは破棄されないので気をつけてください。
原文
原文
You can override this method to perform additional tasks associated with presenting the view. If you override this method, you must call super at some point in your implementation.
和訳
和訳
このメソッドを現在のビューにタスクの追加を行う時にオーバーライドできる。
このメソッドをオーバーライドするときは、実装のどこかにスーパーメソッドを呼ぶ必要がある。