Change before you have to.

androidアプリ開発、iosアプリ開発、rails、deep learning .etc.を使った社会実験。

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);
}

 

実行結果は以下の通りです。

ボタンを押す前:

f:id:ichonol:20140116004955p:plain


ボタンを押した後:

f:id:ichonol:20140116005004p:plain

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と言う割に四隅が四角いので実際にアプリを作るときは

そうした四角い作りにするか、

他の画像などを代替した方が良さそうです。

 

長くて冗長ですみません、

次回はもう少しまとまりのある感じで書こうと思います。

 

それから随時イラストも書いていかなければならないので

自分でphotoshopillustratorを購入して

参考本も買って勉強していく予定です。

 

続きます。