2012年2月2日木曜日

iphone クイズアプリの作り方 その③

画面の設定が終わったところで、
次は、アクションの設定をしたいと思います。

アクションの実装は、そうです。
「QuizViewController.m」を編集していきます。


まずはソースを見てみると、

----
#import "QuizViewController.h"
#import "QuizRunningViewController.h"
#import "Quiz.h"

@implementation QuizViewController


- (void)dealloc
{
[_quiz release];
[super dealloc];
}


- (IBAction)startQuiz:(id)sender
{
if (!_quiz)
{
_quiz = [[Quiz alloc] init];
NSBundle *bundle = [NSBundle mainBundle];
NSString *path;
path = [bundle pathForResource:@"quiz" ofType:@"txt"];
[_quiz readFromFile:path];
}
[_quiz clear];
QuizRunningViewController *viewController;
viewController = [[QuizRunningViewController alloc] init];

[viewController setQuiz:_quiz];

[self presentModalViewController:viewController
animated:YES];
}

@end
----


長過ぎます、、、

まずはいつもみたいに少しづつ見ていきましょう。

#import "QuizViewController.h"
#import "QuizRunningViewController.h"
#import "Quiz.h"

最初は、ヘッダファイルをインクルードします。
なんかみっつもありますが、
これからQuizRunningViewController.h、Quiz.hも作っていきます。
とりあえず全部インポートしておきましょう。



@implementation QuizViewController

「@implementation」では、メソッドの具体的な内容を実装します。
ここは「QuizViewController」メソッドの具体的な内容ですよー
ということでしょうか。

他のファイルを全部見ても、
XXXX.mファイルには、
@implementation XXXX


YYYY.mファイルには、
@implementation YYYY

って書いてあったので、こういうもんだって覚えてしまおうと思います。


- (void)dealloc
{
[_quiz release];
[super dealloc];
}


- (void)deallocは何だろうと思い調べてみたところ、
Objective-Cは、ガベージコレクションがない時代のプログラミング言語のようで、
プログラマがきちんとオブジェクトを解放してあげないと、
メモリがやばいことになってしまうみたいでした。

なので、「QuizViewController.h」で設定した、
_quiz変数をきちんと解放しましょうーということなんだと思います。


その下の、
[super dealloc];とは何でしょうか。。
調べてみたら、
親クラスのデストラクタを[super dealloc]にてにて解放。とありました。

でもこれ、デフォルトで設定されていたので、
特に気にせず残しておけばいいんだと思います。



- (IBAction)startQuiz:(id)sender

いよいよきました!!!
スタートボタンに設定したアクション名「startQuiz」アクションの中身を書いていきます。


if (!_quiz)
{
_quiz = [[Quiz alloc] init];
NSBundle *bundle = [NSBundle mainBundle];
NSString *path;
path = [bundle pathForResource:@"quiz" ofType:@"txt"];
[_quiz readFromFile:path];
}

まずはここです。
何をやっているんでしょうか。

if (!_quiz)

これは「もし〜だったら」ですね。()の中に、
〜の部分を書きます。

!_quiz

「!」とは、「〜でない」ということなので、
これはもし「_quiz」がなかったらってことですね。


_quiz = [[Quiz alloc] init];

これは、 _quizのインスタンスを作って初期かしているみたいです。
_quizのメモリを確保しているみたいですね。


つぎは、
どこにクイズがあるのか、クイズのフォルダパスを指定します。

// バンドルを取得する
NSBundle *bundle = [NSBundle mainBundle];
NSString *path;


NSBundleはアプリケーションのリソース(クラス、Xib、画像などのファイル)を
まとめて管理してくれる仕組みを提供するクラスで、
NSBundleを使用することにより、ファイルのパスを指定したいような時でも、
バンドルが教えてくれるのでファイル管理が大変便利に行えたりします。
とのことです。

// プロジェクトに管理されているファイル「quiz.txt」のパスを取得する
path = [bundle pathForResource:@"quiz" ofType:@"txt"];


//_quizに、先ほど読み込んだファイルパスからquiz.txtを読み込ませます。
[_quiz readFromFile:path];


ようやっと読めてきました。

[_quiz clear];

次は、_quizに入っているものをクリアして、
出題済みの情報をクリアにします。

ーーー
ここまでで、出題する問題を読み込んで、
同じ問題が出題されないようにクリアにするってことですね。


QuizRunningViewController *viewController;
viewController = [[QuizRunningViewController alloc] init];

次は、問題を表示する部分でしょうか。
だんだんわかってきました。
「QuizRunningViewController」というクラスオブジェクトの変数「viewController」
を用意し、「viewController」のインスタンスを作成しています。



[viewController setQuiz:_quiz];

これは[オブジェクト名 メソッド名:引数]でしたね。
viewController さん、_quizからクイズ情報をセットしてくださいー
って感じですね。


[self presentModalViewController:viewController animated:YES];

なんだか初めて見た「presentModalViewController」にドキドキです。
ちょっと調べてみましたら、

UIViewの上に、一時的に別の画面(UIView)を表示させたい時は、
おおまかに二通りの方法があるみたいです。

1、表示中の UIView に addSubview メソッドで新しい UIView を載せる。
2、UIViewController の presentModalViewController:animated: メソッドを使って、
  新しいUIViewController と入れ替える。


どちらを使うのが良いのかは、UIをどうするかで判断すると良いみたい。
詳細はこちら

今回は、2番の方を使って、新しい画面を出しているみたいですね。
もっと調べてみると、presentModalViewControllerは、
UINavigationControllerクラス、UITabBarControllerクラスのスーパークラスでもあるみたいです。


これは、「viewController」という画面を、アニメーション付きで出します
ということですね。

これで「QuizViewController.m」の編集は終わりです!
長かっただですね、、><


まだまだ頑張ります!

0 件のコメント:

コメントを投稿