-
Notifications
You must be signed in to change notification settings - Fork 336
1.5 UIViewController3 ライフサイクル
参考 : UIViewController Class Reference | ViewController プログラミングガイド
UIViewControllerが生成され、表示、レイアウト調整、非表示、破棄のようにUIViewControllerは状態がいくつか遷移します。 その一連の流れのライフサイクルについて解説します。
SampleProjects/1.5/SampleOfLifeCycle に簡単なサンプルアプリがあります。
UIViewControllerの生成方法はいくつかあります。
メソッド | 呼ばれるケース |
---|---|
- initWithCoder: |
UIViewControllerのイニシャライザではなく、準拠しているNSCodingプロトコルのメソッドです。storyboardから生成される場合はこのメソッドが呼ばれます。 |
- initWithNibName:bundle: |
UIViewControllerのレイアウトを記述したxibからViewControllerを生成する際に呼ばれるメソッドです。 |
-init |
NSObjectのイニシャライザです。UIViewControllerでこのメソッドを呼んだ場合、自動的に - initWithNibName:bundle: が呼ばれます |
初期化のメソッドも複数あるので、呼び出し方、呼び出され方を意識してイニシャライザを記述する必要があります。 またこのイニシャライザが呼ばれた段階ではViewControllerとしてのインスタンスは生成されていますがviewのインスタンスは生成されていません。 そのために、これらのイニシャライザの中でviewのレイアウトをすることはできないので注意が必要です。
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// 初期化のコードをここに記述する
}
return self;
}
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:NSStringFromClass([self class]) bundle:nibBundleOrNil];
if (self) {
// 初期化のコードをここに記述する
}
return self;
}
- (instancetype)init
{
self = [super init];
if (self) {
// 初期化のコードをここに記述する
}
return self;
}
viewの読み込みが完了すると - viewDidLoad
が呼ばれます。
この段階ではviewのインスタンスが準備できているのでレイアウトや追加のコードを挿入することもできます。
このメソッドはviewの読み込みが完了した一回のみ呼び出されます。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"viewDidLoad");
}
インスタンスが生成され、viewが表示されるタイミングでは
- viewWillAppear:
と
- viewDidAppear:
が呼ばれます。それぞれ、viewが表示される直前とviewが表示完了した直後に呼ばれます。例えばアニメーションを行ってViewControllerを表示する場合、
viewWillAppear:
→ 表示アニメーション → viewDidAppear:
の順に呼び出されます。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear");
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear");
}
これらのメソッドは表示される度に呼び出されます。例えばモーダルで新しいViewControllerを表示して、モーダルを閉じると 再び画面が表示されるのでこれらのメソッドが呼ばれます。
UIViewControllerのviewのレイアウトの調整が何度か行われます。 例えばstoryboardやxibから読み出した状態ではviewControllerのサイズはそのstoryboardやxibでレイアウトを記述したときのサイズで読み出されるので、画面サイズに合わせて調整が行われます。 他にも、画面を回転したときにもレイアウトの調整などが行われます。この時にこれらのメソッドが呼び出されます。
- (void)viewWillLayoutSubviews
{
NSLog(@"viewWillLayoutSubviews");
[super viewWillLayoutSubviews];
}
- (void)viewDidLayoutSubviews
{
NSLog(@"viewDidLayoutSubviews");
[super viewDidLayoutSubviews];
}
ViewControllerインスタンスが非表示になるとき、なった時にそれぞれ - viewWillDisappear:
、- viewDidDisappear:
が呼ばれます。
表示の時と同様に、それぞれ非表示になる直前、直後に呼ばれます。遷移アニメーションとの組み合わせは
- viewWillDisappear:
→ 遷移アニメーション → - viewDidDisappear:
のようになります。このメソッドも非表示になる度に呼ばれ、何度も呼ばれる可能性があります。
- (void)viewWillDisappear:(BOOL)animated
{
NSLog(@"viewWillDissAppear");
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
NSLog(@"viewDidDissappear");
[super viewDidDisappear:animated];
}
オブジェクトが誰からも参照されなくなり、メモリから解放されるときに- dealloc
が呼ばれます。
UIViewController固有のものではなくNSObjectのメソッドになります。ARCでメモリ管理をしている場合、[super dealloc]
のようにスーパークラスのdeallocを呼ぶとコンパイルエラーとなります。
-(void)dealloc
{
NSLog(@"dealloc");
}
はじめに
-
導入
-
1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)
-
UIKit 1 - container, rotate-
-
UIKit 2- UIView -
-
UIKit 3 - table view -
-
UIKit 4 - image and text -
-
ネットワーク処理
-
ローカルキャッシュと通知
-
Blocks, GCD
-
設計とデザインパターン
-
開発ツール
-
テスト
-
In-App Purchase
-
付録