このページは「iPhoneプログラミング入門」(工学社刊、ISBN 978-4-7775-1541-7)を読んで、もっと先へ進んでみたいと思った人への説明です。

「次の一歩」一覧へ

ビュー・コントローラ間でのデータの受け渡し、その1「新しいページへデータを送る」

「最も簡単なナビゲーション」から発展

アプリケーション「FirstNav」、まだでしたらゼヒ

本文書は、すでにこのサイトに掲載した「最も簡単なナビゲーションの作り方」 のサンプルプログラム「FirstNav」をちょっと書き換えることで、課題を実践します。
「FirstNav」は、実は「テーブル」を扱うプログラムです。「自分はデータの送り方を知りたいだけで、テーブルの作り方は必要ない」と思われるかも知れませんが、ちょっと進んだアプリを作ろうとか、とりわけ「巷のサンプルプログラムを研究しよう」というときに、「テーブルを含んだアプリの理解」はまず避けては通れません。
ですから、上記リンクの文書をまだ御覧になっていない場合はゼヒ、ちょっと我慢して、サンプルを実践してみておいてください。きっと役に立ちます。
なお、これからサンプル「FirstNav」を作ってみるという方は、「最も簡単なナビゲーションの作り方3」まで進んでいただければ充分です。
また、本書及び、サポートページの以前の記事はXcode3を用いての作業について説明していますが、現在はXcode4を使っておられる方も多いと思います。Xcode4の「使い方」については、別ページに特集を掲載していますので、参考にしてください。

「 FirstNav」のどこを書き換えるのか

サンプルアプリケーション「FIrstNav」では、まず「Red」「Green」「Blue」という3件の文字列(これらは固定値)。をテーブルに配置しました。
そして、「Red」をクリックすると「赤い背景の画面」、「Green」をクリックすると「緑色の背景の画面」に移動するようにしました。
図1 「Red」「Green」「Blue」いずれかの項目をクリックすると・・・


いかにも「Red」「Green」などの項目が次のページにデータとして送られるような感じにできましたが、記事をよく読まれた方には、ややインチキだということがわかると思います。
それは、リスト1の概要に示すようなしくみで、背景色を変えて別々に作ったビューコントローラの「どれを呼び出すか」を振り分けているだけです。データは、送っていないのです。
リスト1 色の違う別のページを呼び出していた
NSString *controllerName=
 (表の中でRedを選んだらRedViewController、Greenを選んだらGreenViewController...のように文字列の内容を決める)
 .....

UIViewController *nextViewController =
	[[NSClassFromString(controllerName) alloc] initWithNibName:controllerName bundle:nil];

}

この、リスト1の辺りを書き換えます。
切り替え先のビューコントローラはいつも同じもので、文字列表示用のラベルを一つ持つものを作ります。
切り替え元のビューコントローラ(FirstNavViewControllerという名前)では、そのラベルの文字列値として"Red", "Green","Blue" のどれかを、切り替え先のビューコントローラに送ります。切り替え先では、その文字列値を、自らのラベルに表示するのです。
図2 図1のように「Green」をクリックした場合に、現れる画面


Xcode3用のプロジェクトをXcode4で読み込む

「FirstNav」を編集して行こう

本記事を実践されるにはゼヒ「FirstNav」を実践してくださいとお願いしたので、実践していただいていると思います。それを使いましょう。
すでに「Xcode3」で「FirstNav」を作成された場合、Xcode4で、そのプロジェクトを開くことができます。以下に、その様子を御紹介します。

「FirstNav.xcodeproj」を開く

Xcode4のメニュー「FIle」-「Open」を選択します。「Open」というウィンドウが出て来て、開くファイルを探すことができますので、「FirstNav」フォルダを探して、開け、その中の「FirstNav.xcodeproj」というファイルを選択して「Open」をクリックします。

各「グループ」の下にファイルが表示される

Xcode4のウィンドウが起動して、左側の「プロジェクトナビゲータ」に、ポツンと「FirstNav.xcodeproj」というアイコンが表示されていると思います。それは実は「折り畳まれて」いるので、左横の「三角形」をクリックすることにより、各「グループ」、そしてその下のファイルが現れます。
「FirstNav」では、プロジェクトの作成時に自動作成されたヘッダファイルと実装ファイルが「classes」グループに入っています。また、「MyViews」というグループを新たに作成して、そこに我々が作成したヘッダファイルと実装ファイルを入れてあるはずです。
図3 プロジェクト「FirstNav」のグループとファイルを表示する

読み込んだ直後の「警告」は気にしない

読み込んだ「FirstNav」、注意深い人は「ステータス表示画面」などに黄色い三角印で警告が表示されているのに気づくかも知れません。
「Xcode3」で警告などなかったプロジェクトを読み込んだ直後に警告が表示された場合、それは気にすることはありません。
その警告は、「プロジェクトはiOS4.0 SDK用に書かれているけれど、Xcode4にはiOS4.0 SDKはついていません」ということを示しています。Xcode4についているのはiOS4.3だからです。
でも、我々が作っているような簡単なプログラムでは、iOS4.3でもiOS4.0用のプロジェクトを問題なくビルド・実行できます。気にしないで作業を進めます。
図4 読み込んだ直後の警告は気にしない


RedViewControllerを利用する

「RedViewController」にラベルを追加して使おう

本記事の実践に用いるビューコントローラは、「最も簡単なナビゲーションの作り方3」で作成した「RedViewController」にラベルを追加するだけで構いません。「Red」という名前が「赤」に偏っているのがあまりカッコよくないのですが、新しくビューコントローラを作り直すより簡単です。もちろん、新しく本記事専用のビューコントローラを作成していただいても全く問題ありません。

RedViewController.xibを編集

インターフェイス・ビルダーで、「RedViewController.xib」に「Label」オブジェクトを追加します。Xcode4でインターフェイス・ビルダーを用いる方法は、別ページの解説を御覧ください。
図5 Xcode4でRedViewController.xibを編集中


RedViewControllerクラスに、プロパティを追加

RedViewController.hとRedViewController.mを編集して、RedViewControllerクラスに以下のプロパティを追加します。


RedViewController.mの「viewDidLoad」メソッドを変更

RedViewController.mをさらに編集します。本章第17章276ページに述べた通り、「viewDidLoad」メソッドはコメントアウトされているので、アンコメントして、リスト1のように書いておきます。
リスト1 textLabelの中身をlabelstrにする
 textLabel.text=_labelStr;
第17章278-279ページでも実は同じようなことをやっています。本記事のほうが、もっと簡単ですね。
しかし、labelStrの中身はどうするのか。それを、ページの切り替え元であるビューコントローラが設定します。切り替え元のビューコントローラを記述する実装ファイル、「FirstNavViewController.m」を編集しましょう。

FirstNavViewController.mを編集

古い記述をコメントアウトしてあれば、復活させよう

最も簡単なナビゲーションの作り方3」の記述を、「...5」で編集したときに、前の記述をコメントアウトしておいた場合は、それを「アンコメント」して復活させられます(そのとき「5」で編集した内容の方をコメントアウトします)。
「そんな話はきいてない」という方、すみません。ちょっとの編集ですから、改めて書き直しを御願いします。

呼び出す画面のプロパティを指定する

「RedViewController」の画面だけを使うように、記述を元に戻すとなると、リスト2のようになります。
リスト2 古い記述。これを使う
RedViewController *nextViewController =
		[[RedViewController alloc] initWithNibName:@"RedViewController" bundle:nil];


リスト2をエラーなく書くためには、ファイルの最初に、リスト3などのようにしてこのファイルに「RedViewControllerクラス」の存在を教えてやることが必要です。もし記述していない場合は、付加しておいてください。
リスト3 いくつか方法はあるが、たとえばこのようにして、RedViewControllerクラスの存在を教える
#import "RedViewController.h"


古い記述では、リスト2のあとに、すぐリスト4が来ることになっていました。
リスト4 次の画面をプッシュする
 [self.navigationController pushViewController:nextViewController animated:YES];


ここからが、全く新しい、本記事で初めて書き加える内容です。リスト4の前に、リスト2で作成した「RootViewControllerオブジェクト」である「nextViewController」の、プロパティ「listStr」に、値を渡します。

まず、表で「Red」を選んだら「Red」という文字列、「Green」を選んだら「Green」という文字列・・・のように、値を取り出します。取り出した値は、ここで即時作成する文字列「sendStr」に割り当てます。それがリスト5です。
リスト5 選んだ表の「行」に応じて値を取り出す
NSString *sendStr=
	[[NSString alloc] initWithFormat: @"%@", [theList objectAtIndex:indexPath.row]];


このsendStrの中身を、オブジェクトnextViewControllerのプロパティ「listStr」に渡します。それがリスト6です。
リスト6  取り出した値を渡す
nextViewController.labelStr=sendStr;


リスト2, リスト5、リスト6、そしてリスト4という順番になります。 あとは、古い記述も含めた「後始末」です。それがリスト7です。
リスト7 メソッド内で作成したオブジェクトを「解放」
[nextViewController release];
[sendStr release];

以上で、本記事における編集は終わりです。アプリケーションを実行してみましょう。
記事の最初に示したように、最初に出てくる画面の「表」で「Green」を選ぶと、切り替わった先の画面に「Green」が表示されるでしょうか。

行きは簡単、帰りは...

以上、ある画面から切り替わる次の画面へデータを送ることは、わりと簡単でしたね。
しかし、切り替わった先から、「元に戻るとき」はどうでしょうか。
たとえば、「一覧」->「新規入力画面」->「再び一覧で、新規入力の内容を確認」のような場合です。これはちょっと難しいですが、できるようになれば大変な強みになります。次の記事では、なるべく簡単なサンプルで、そこをやってみましょう。

切り替わった先から元の画面にデータを送る

「次の一歩」一覧に戻る