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

<- 前へ
「次の一歩」一覧へ

ビュー・コントローラ間でのデータの受け渡し、その2「元のページへデータを返す」

---(5)「プロトコル」のメソッドを「使ってあげる」側のコード ---

ヘッダファイル「ShowMessageViewController.h」の編集

「プロトコルを用いる」宣言の追加

「ShowMessageViewController.h」で、以下の「クラスの宣言」のところに注目してください。
リスト1 クラス「ShowMessageViewController」が宣言されているおなじみの文
 @interface ShowMessageViewController : UIViewController {


この部分に「MyModalViewControllerDelegate」プロトコルを「用いる」宣言を加えます。これは、本書第18章の最初の数ページにわたって説明している「FirstViewAppDelegateで、UIApplicationDelegateプロトコルを用いる宣言」の話と同じです。リスト2のように書きます。
リスト2 「MyModalViewControllerDelegate」プロトコルを使う
 @interface ShowMessageViewController : UIViewController<MyModalViewControllerDelegate> {


「ShowMessageViewController.h」に書くことは、これだけです。ちょっと意外ですね。

実装ファイル「ShowMessageViewController.m」 を編集

「誰か、それはわたしです」と宣言するところ

さて、前のページで何度となく、「MyModalViewControllerが『誰かこのメソッドを使ってください』と言う記述をします」と書きました。その「誰か」を、「ShowMessageViewController」が「わたしです」と、名乗りを上げるわけですが、それはどこかと言いますと、「ShowMessageViewController」が「MyModalViewController」を「モーダルビューコントローラ」として呼び出すところです。
それは、ナビゲーションバー上の「Edit」ボタンを押したときで、本記事中の「準備すること」のページに示したメソッド「editButtonPressed」です。
「MyModalViewController」クラスのオブジェクト「mvController」を作成したら、そのmvControllerのプロパティ「delegate」に「わたし」を指定するのです。
リスト3 作成したmvController、そのプロパティdelegateが「わたしです」
 
    MyModalViewController *mvController=
    [[MyModalViewController alloc] initWithNibName:@"MyModalViewController" bundle:nil];
    
    mvController.delegate=self; 



このあとで、既に記述済みの「モーダルビューコントローラとして呼び出す」作業が行われます。

プロトコルに定義されたメソッドを実装する

「プロトコルを用いる」とは、プロトコルで定義されたメソッドを自分のメソッドとして定義し、実際の処理を書くことです。これを「実装する」と呼びます。
「ナニナニAppDelegate.m」に「application: didナニナニ...」というメソッドがたくさん定義されているのも、全て「UIApplicationDelegate」プロトコルで定義してあるメソッドです。

同様に、「showMessageViewController中に、リスト4のようにメソッド「mymodalviewcontroller:didClose:」を実装します。まず、枠組みだけ書きます。これでも立派な「実装」です。「何もしないことを決めている」という、何かの哲学のような実装ですね。
リスト4 まずとにかく枠組みを書く
-(void)mymodalviewcontroller:(MyModalViewController *)mymodalviewcontroller didClose:(NSString *)message{
    
    
}

メソッドはいつ実行されるのか

ここに定義したメソッド「mymodalviewcontroller:didClose:」はいつ実行されるのでしょうか。それは、「MyModalViewControllerのビュー」の「Show」ボタンが押されたときです。
思い出してください。そのとき、メソッド「showButtonPressed」が呼ばれます。その中で、このメソッドが呼ばれます。
引数は、入力欄の文字列。そして、呼び出し元は、「MyModalViewController」のプロパティ「delegate」です。
その「delegate」は、上のリスト3によりこの「showMessageViewController」であると宣言されています。こういうカラクリなのです。

まずmessageの中身を受け取ります

では、このmymodalviewcontroller:didClose:メソッドの中身を書いて行きましょう。まず、引数messageの内容には、文字列が入っています。それを受け取って、自分のラベル「showLabel」の表示文字列に設定します。
リスト5 引数として送られた中身を受け取る
showLabel.text=message;

そしてモーダルビューコントローラを閉じます

リスト6 モーダルビューコントローラを閉じる
 [self.navigationController dismissModalViewControllerAnimated:YES];    


これで、本記事のアプリケーションは完成です。長かったですね。実行して、動作を確かめてみてください。


お疲れさまでした。「次の一歩」一覧に戻ります。