このページは「iPhoneプログラミング入門」(工学社刊、ISBN 978-4-7775-1541-7)を読んで、もっと先へ進んでみたいと思った人への説明です。
<-前へ
「次の一歩」一覧へ
最も簡単なモーダルビューの作り方4
メソッド「showInfo」の移動と、ちょっとした編集
「FirstModalAppDelegate.h」から「FirstModalViewController.h」へ
「FirstModalAppDelegate.hに書いた、メソッドshowInfoの定義を、「FirstModalViewController.h」に移動します。前の既述はコメントアウトして、あとで戻せるようにしておきましょう。
「FirstModalAppDelegate.m」から「FirstModalViewController.m」へ
「FirstModalAppDelegate.mに書いた、メソッドshowInfoの実装を、「FirstModalViewController.m」に移動します。こちらも、前の既述はコメントアウトしておきましょう。
また、「FIrstModalViewController」のほうに、「InfoViewController.hをインポートする宣言を書いておきます。
それでも、まだ安心できません。もし、このページの通りにプログラムを書いていたら、リスト1の部分がエラーになります。
リスト1 「navController」というところでひっかかる
[self.navController presentModalViewController:......
なぜなら、「navController」は、「FirstModalAppDelegate」クラスに、私たちが意図的に命名して加えたプロパティだからです。
今、メソッドを「FirstModalViewController」クラスの定義に引っ越しました。このクラスでは、わたしたちは「navController」というプロパティを定義していません。
「FirstModalViewController」クラスには「navigationController」というプロパティが「ある」
では、こちらのクラスにもプロパティを定義すればいいかというと、その必要はありません。
こちらは「UIViewController」というクラスを元にしています。このクラスには、もともと「navigationController」というプロパティがあります。すでに「最も簡単なナビゲーションの作り方」で利用済みです。ですから、リスト2のように直せばいいのです。
リスト2 最初から用意されているプロパティ「navigationController」を使えばよい
[self.navigationController presentModalViewController:......
MainWindow.xibの再編集
Xcode4使用上の注意
MainWindow.xibを開きます。
Xcode4を使っている人は、「ナビゲーションコントローラ」の表示されない真っ白な画面に遭遇して驚くかもしれません。それは、真っ白な「window」の画面が選択されて、前面に出ているからです。
左側に、Xcode3でいう「ドキュメント・ウィンドウ」に相当する、縦に細長い領域がありますね。ファイルオーナー、デリゲート、ナビゲーションコントローラなどのアイコンがあります。その中で、「window」が選択されていると、その真っ白な画面が前面に現れます。
対処法は、「ナビゲーションコントローラ」のアイコンをクリックするか、マウスで前面の画面を移動させると、後ろに現れます。
図5 真っ白なだけのウィンドウをマウスでずらすと、後ろにナビゲーションコントローラなどが現れる
前の接続を消す
ナビゲーションコントローラの上にあるボタン「Info Light Button」のイベント「Touch Up Inside」を調べます。「FirstModal App Delegate」の「showInfo:」 メソッドと結びついていると思います。その接続を消去します。
ビュー上に連結線を引っ張る
今回「Touch Up Inside」と連結したい相手は、「FirstModal View Controller」の「showinfo:」メソッドです。
それには、ビュー上のどこかに連結線を引きます。ただし、このビューは前ページまでの動作がうまく行っていればOKです)
"図6では「FirstModalView」という字が書いてある(Xcode4では書いていないかと思われます)のでつい、そこを狙ってしまいましたが、別に他の場所でもView上であればOKのはずです。
「ドロップ」すると「showinfo:」という選択肢が出て来ますので、それを選択します。
図6 ビュー上のどこかに連結
図7 「showInfo:」メソッドが候補に挙がるので選択
図8 「FirstModalViewControllerのshowInfo」と結合された
一方、「FirstModalViewController.xib」のほうも編集して、好きなデザインの画面にしておきます(このアプリケーションでは、「FirstModalViewController」のビュー上の部品を何か操作することはしません)
アプリケーションを起動してみましょう。もっとも、起動画面がデザインされたものになるだけで、動作は前と変わりません。「ナビゲーションバー」の「infoボタン」をクリックすると、モーダルビューが出て来て、そこの「OK」ボタンをクリックすると引っ込みます。
図9 「FirstModalViewControllerのビューもデザインした」
「parentViewController」が変わる
目的の動作を得るということではこれで完成ですが、一部ソースコードの意味が変わっているのに注意が必要です。
「InfoViewController.m」の、リスト3の部分を見てください。「parentViewController」は、自分を呼び出したビューコントローラです。今度は、「ナビゲーションコントローラ」ではなく「FirstModalViewController」のことになりました。
リスト3 「parentViewController」の既述は変わらないが、指すものは変わった
[self.parentViewController dismissModalViewControllerAnimated:YES];