iPhoneアプリの仕組み
続きです。
これまで
・iOS Developer登録(申請篇、アクティベート篇、完結篇)
について書いてきました。
特に前回は、いざプログラミング!ということで簡単なコードを書いて実行するところまでやりました。
その中でViewControllerを画面に表示される「板」に見立てて
最初に呼び出される関数※がviewDidLoadであるということを学びました。
※C言語では関数というコードの集まりは
iPhoneアプリを記述するobjective-cではメソッドと呼ぶらしいので
今後はメソッドと呼称で統一していきます。
しかし、どうやらこれは正確な表現ではなさそうです。
viewDidLoadの前に実行されるメソッドがあるためです。
ViewControllerの起動プロセスをこのサイトを参考にまとめてみました。
①init(WithNibName):viewController自体の初期化
・使用する変数(表示部品以外)等の初期化
②viewDidLoad:表示前に一度だけ呼び出される
・使用する変数(表示部品)等の初期化
③viewWillAppear:表示される度に(表示直前に)呼び出される
・表示部品等を初期位置に配置する
④viewDidAppear:表示される度に(表示直後に)呼び出される
・表示部品等を動かしたり、ユーザーからの入力を受け付ける
⑤viewWillDisappear:非表示される度に(非表示直前に)呼び出される
・動いている部品の位置を記憶させる
⑥viewDidDisappear:非表示される度に(非表示直後に)呼び出される
・次回の再表示の準備等
※ゲーム中に画面が隠れた場合等で時間計測を停止して、次回続きから再開するときに
このメソッド等が使えるのではないかと思いました。
今回、新たにViewControllerという板を作って、
上の通りの順番になっているか確認してみました。
それだけではつまらないので、画面全体を緑色に塗ってみました。
まず、新たにNextViewControllerという板を作るために
最初に作ったViewControllerクラスの中の
viewDidAppearというメソッドを以下のように書き換えました。
つまりViewControllerという板が見えたら、次のNextViewControllerを見せて下さい、というコードを書きました。
-(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btn setTitle:@"before" forState:UIControlStateNormal]; btn.frame = CGRectMake(100, 100, 100, 40); btn.backgroundColor = [UIColor colorWithRed:0.5 green:0 blue:0 alpha:0.5f]; [btn addTarget:self action:@selector(pushedButton) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; } //ボタンを押した時に呼び出されるメソッド -(void)pushedButton{ //新たに板を作る NextViewController *next = [[NextViewController alloc]init]; [self presentViewController:next animated:YES completion:nil]; }
次にxcodeのFile-New-FileでObjective-Cのクラスファイルを作成して名前をNextViewControllerとします。
するとNextViewController.m(と同.h)というファイルがそれぞれできるので
このファイルの中を以下のように書きました。
-(id)init{ self = [super init]; NSLog(@"init"); return self; } -(id)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; NSLog(@"initWithCoder"); return self; } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; NSLog(@"initWithNibName"); if (self) { // Custom initialization } return self; } - (void)viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view. NSLog(@"viewDidLoad"); } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; NSLog(@"viewWillAppear:%d", animated); } -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; NSLog(@"viewDidAppear:%d", animated); [self.view setBackgroundColor:[UIColor greenColor]]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btn setTitle:@"next" forState:UIControlStateNormal]; btn.frame = CGRectMake(100, 100, 100, 40); btn.backgroundColor = [UIColor colorWithRed:0.5 green:0 blue:0 alpha:0.5f]; [btn addTarget:self action:@selector(pushedButton) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; } //ボタンを押したときの反応 -(void)pushedButton{ //NextViewControllerを消す [self dismissViewControllerAnimated:NO completion:nil]; } -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; NSLog(@"viewWillDisappear:%d", animated); } -(void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:animated]; NSLog(@"viewDidDisappear:%d", animated); }
実行結果は以下の通りです。
ボタンを押す前:
ボタンを押した後:
2014-01-16 00:29:33.453 Test001[37287:70b] initWithNibName 2014-01-16 00:29:33.454 Test001[37287:70b] init 2014-01-16 00:29:33.455 Test001[37287:70b] viewDidLoad 2014-01-16 00:29:33.456 Test001[37287:70b] viewWillAppear:1 2014-01-16 00:29:33.960 Test001[37287:70b] viewDidAppear:1 2014-01-16 00:29:33.961 Test001[37287:70b] viewWillDisappear:0 2014-01-16 00:29:33.963 Test001[37287:70b] viewDidDisappear:0
各メソッドのanimatedというのが気になったので
NSLogで吐き出したら意味が分かりました。
どうやらviewWillAppearとviewDidAppearの引数は
呼び出す時のpresentViewController:next animated:YES completion:nilの引数(この場合yes)に相当し、
viewWillDisappearとviewDidDisappearの引数は
消去するときのdismissViewControllerAnimated:NO completion:nilの引数(この場合NO)に対応していることが分かりました。
あと、今回、ボタンで画面の切り替えをしたのですが、
ボタンのタイプUIButtonTypeRoundedRectというのはiOS7では推奨されていないようですね。
roundedと言う割に四隅が四角いので実際にアプリを作るときは
そうした四角い作りにするか、
他の画像などを代替した方が良さそうです。
長くて冗長ですみません、
次回はもう少しまとまりのある感じで書こうと思います。
それから随時イラストも書いていかなければならないので
自分でphotoshopとillustratorを購入して
参考本も買って勉強していく予定です。
続きます。