UIViewController ライフサイクルについて その1
UIViewControllerのライフサイクルについて会社での研修の確認で
ちょっと話しに上がったので、まとめてみる事にしました。
まずはUIViewControllerでライフサイクル用に用意されているメソッドを列挙。
- (void)loadView;
- (void)viewDidLoad;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
動作確認用に以下のLifeCycleTestプロジェクトをWindowBaseで作成。
LifeCycleTestViewControllerをnib無しで作成。
.mに該当のライフサイクルメソッドを以下のように定義。
//--------------------------------------------------------------//
#pragma mark -- View lifecycle --
//--------------------------------------------------------------//
- (void)loadView
{
[super loadView];
NSLog(@"loadView");
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"viewDidLoad");
self.view.backgroundColor = [UIColor yellowColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame =
CGRectMake((self.view.frame.size.width - 100) /2,
(self.view.frame.size.height - 30) /2,
100.0,
30.0);
[button setTitle:@"remove" forState:UIControlStateNormal];
[button addTarget:self action:@selector(removeAction:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear");
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear");
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"viewWillDisappear");
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"viewDidDisappear");
}
//--------------------------------------------------------------//
#pragma mark -- LifeCycleTestViewController method --
//--------------------------------------------------------------//
- (IBAction)removeAction:(id)sender
{
[self.view removeFromSuperview];
}
Viewが消えるタイミングも確認するために、viewDidLoadメソッドに
UIButtonを生成する処理も入れてます。removeActionでviewを消す感じですね。
次にLifeCycleTestAppDelegate.mの
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
メソッドでLifeCycleTestViewControllerを生成。windowにaddSubviewします。
@interface LifeCycleTestAppDelegate : NSObject
UIWindow *window;
LifeCycleTestViewController *lctViewController;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
lctViewController = [ [LifeCycleTestViewController alloc]init];
NSLog(@"lctViewController create");
[window addSubview:lctViewController.view];
[window makeKeyAndVisible];
return YES;
}
- (void)dealloc
{
[lctViewController release];
[window release];
[super dealloc];
}
はい、以上で一応準備は完了。
では実行して確認してみます。
下みたいな画面が出ます。
上の画面のremoveボタンを押す所まで処理してログの結果は以下の通りに出ました。
LifeCycleTest[2193:207] lctViewController create
LifeCycleTest[2193:207] loadView
LifeCycleTest[2193:207] viewDidLoad
LifeCycleTest[2193:207] viewWillAppear
LifeCycleTest[2193:207] viewDidAppear
LifeCycleTest[2193:207] viewWillDisappear
LifeCycleTest[2193:207] viewDidDisappear
順序としては
表示系が
loadView → viewDidLoad → viewWillAppear → viewDidAppear
viewWillDisappear → viewDidDisappear
各メソッドの詳細についても書きたかったのですが、ちょっと長くなってきたので
次回(その2)に続きを書く事にして、本日はこれまでとします。
【今回のサンプルプロジェクト】
良ければよろしくお願いします