前回の第1案、Interface BuilderでSecondViewControllerのOutletとしてUITableView、UITextView、UIImageViewを設定する方法をやりますよん。
このSecondViewControllerは「iPhoneアプリ開発、その(155)」で作った投稿詳細表示ページに該当するView用のControllerということになります。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091101/23/xcc/5f/48/j/o0402035810293744418.jpg?caw=800)
で、まずは以下のような画面とうい事でInterface BuiderでViewを準備したわけですが、この各ViewにSecondViewControllerがアクセスする方法としてXcodeのクラス定義でIBOutletというキーワードを使うんですな。
![$テン・シー・シー-1](https://stat.ameba.jp/user_images/20091122/21/xcc/e6/2c/j/o0288023010315706334.jpg?caw=800)
とにもかくにもXcodeでSecondViewControllerの作成~。
ファイル>新規ファイル...メニューを選んでワントゥスリー。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091122/22/xcc/66/1c/j/o0500036710315719340.jpg?caw=800)
オプションに同時にXIBファイル作るってのがありますね~。今回はすでにSecondView.xibがあるんで作らないけど、新規に作る場合は重宝するかもね。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091122/22/xcc/a9/61/j/o0500036210315724378.jpg?caw=800)
名前はSecondViewControllerじゃなくDetailViewControllerとしました。
xibと同じ名前にするのが紛らわしくなくていいんだけど、今回は別名でも問題ないという事を示すためにあえて別名にしてみます。
で、今回Viewの各パーツにアクセスするためにDetailViewController.hに変数として以下の3つを用意。いつもと違うのはIBOutletの存在。
ちなみにIBOutletを選択してコンテキストメニューで「定義にジャンプ」を選び定義位置にジャンプするとIBOutletは
というふうに定義されててIBAction同様、プログラム的にはまったく意味がないってのがわかるっすよ。こいつはInterface Builderに知らせるためだけに用意された定義ってわけです。
書き終わったら、いったん保存してSecondView.xibダブルクリックでInterface Builderを起動~。
SecondView.xibウィンドウのFile's Owner(このxibファイルをinitWithNibName:で読み込んで利用するインスタンスがファイルの持ち主ってことになる)を選んでInspectorウィンドウのIdentityタブを選ぶと
となってるんで、このコンボボックスからDetailViewController(ちゃんと出るんですな~)を選びます。
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20091122/22/xcc/99/88/j/o0500043910315742745.jpg?caw=800)
そうすると、さっきXcodeでDetailViewControllerに定義したIBOutlet変数があらわれるわけですわ。
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20091122/22/xcc/7d/76/j/o0324046810315746003.jpg?caw=800)
あとは、InspectorウィンドウでConnectionsタブをクリックして出てきたOutletの右にある○をドラッグして結びつけたいViewにドロップする。
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20091122/22/xcc/ec/fd/j/o0500027710315752884.jpg?caw=800)
あ、わんとぅすり~
ここらへん昔のInterface Builderと違ってかなり明示的になってますね。
![$テン・シー・シー-7](https://stat.ameba.jp/user_images/20091122/22/xcc/a7/eb/j/o0325025410315756614.jpg?caw=800)
で、3つの変数すべて結び終わったらInterface Builderに用はないので保存して終了。
Xcodeに戻ってDetailViewControllerの実装に入るわけです。
まずはDetailViewController.mの
のコメントを外して
と実装。うりゃっと実行。
ぐあっ!
死にました。
そーなんだよ、FirstController側の呼び出し、UIViewControllerのままじゃんよ。なんてバカだ。DetailViewControllerに修正せんと。
こうなんだよ。こう。#import "DetailViewController.h"も忘れんようにね。
うりゃ、ビルドして実行。
![$テン・シー・シー-8](https://stat.ameba.jp/user_images/20091122/22/xcc/fb/fa/j/o0201037010315772895.jpg?caw=800)
でた、アクセス成功
調子のりお。
このままDetailViewControllerにUITableViewDataSourceを継承させてテーブルの内容部も設定したれぃ!
でも、めんどくさいんで実装するのは以下の3メソッドだけね。
あとはviewDidLoadでsugestionTableViewのdataSourceとしてselfを設定でおしまい。
うりゃっと実行。
![$テン・シー・シー-9](https://stat.ameba.jp/user_images/20091122/22/xcc/25/36/j/o0212037410315796617.jpg?caw=800)
でた
おっしゃあ、景気づけに画像も貼付けてみますか~。とこいつはFirstViewController側のtableView:didSelectRowAtIndexPath:メソッドを拡張して
うりゃっと実行。
変化無し...
デバッガで止めて確認。ctl.imageView.imageがnilでした。
ですね。
initWithNibNameの段階じゃViewは作られてないんですな。
ま、ここらへんどうするかと、ちょっと気になるメソッド
も含めて以下次回!
------------
サンプルプロジェクト:konohana_test4.zip
ゲット!
![treasure](https://stat.ameba.jp/user_images/20100313/12/xcc/45/65/p/o0162024210449158708.png?caw=800)
このSecondViewControllerは「iPhoneアプリ開発、その(155)」で作った投稿詳細表示ページに該当するView用のControllerということになります。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091101/23/xcc/5f/48/j/o0402035810293744418.jpg?caw=800)
で、まずは以下のような画面とうい事でInterface BuiderでViewを準備したわけですが、この各ViewにSecondViewControllerがアクセスする方法としてXcodeのクラス定義でIBOutletというキーワードを使うんですな。
![$テン・シー・シー-1](https://stat.ameba.jp/user_images/20091122/21/xcc/e6/2c/j/o0288023010315706334.jpg?caw=800)
とにもかくにもXcodeでSecondViewControllerの作成~。
ファイル>新規ファイル...メニューを選んでワントゥスリー。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091122/22/xcc/66/1c/j/o0500036710315719340.jpg?caw=800)
オプションに同時にXIBファイル作るってのがありますね~。今回はすでにSecondView.xibがあるんで作らないけど、新規に作る場合は重宝するかもね。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091122/22/xcc/a9/61/j/o0500036210315724378.jpg?caw=800)
名前はSecondViewControllerじゃなくDetailViewControllerとしました。
xibと同じ名前にするのが紛らわしくなくていいんだけど、今回は別名でも問題ないという事を示すためにあえて別名にしてみます。
で、今回Viewの各パーツにアクセスするためにDetailViewController.hに変数として以下の3つを用意。いつもと違うのはIBOutletの存在。
@interface DetailViewController : UIViewController |
ちなみにIBOutletを選択してコンテキストメニューで「定義にジャンプ」を選び定義位置にジャンプするとIBOutletは
#ifndef IBOutlet |
というふうに定義されててIBAction同様、プログラム的にはまったく意味がないってのがわかるっすよ。こいつはInterface Builderに知らせるためだけに用意された定義ってわけです。
書き終わったら、いったん保存してSecondView.xibダブルクリックでInterface Builderを起動~。
SecondView.xibウィンドウのFile's Owner(このxibファイルをinitWithNibName:で読み込んで利用するインスタンスがファイルの持ち主ってことになる)を選んでInspectorウィンドウのIdentityタブを選ぶと
Class UIViewController |
となってるんで、このコンボボックスからDetailViewController(ちゃんと出るんですな~)を選びます。
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20091122/22/xcc/99/88/j/o0500043910315742745.jpg?caw=800)
そうすると、さっきXcodeでDetailViewControllerに定義したIBOutlet変数があらわれるわけですわ。
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20091122/22/xcc/7d/76/j/o0324046810315746003.jpg?caw=800)
あとは、InspectorウィンドウでConnectionsタブをクリックして出てきたOutletの右にある○をドラッグして結びつけたいViewにドロップする。
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20091122/22/xcc/ec/fd/j/o0500027710315752884.jpg?caw=800)
あ、わんとぅすり~
ここらへん昔のInterface Builderと違ってかなり明示的になってますね。
![$テン・シー・シー-7](https://stat.ameba.jp/user_images/20091122/22/xcc/a7/eb/j/o0325025410315756614.jpg?caw=800)
で、3つの変数すべて結び終わったらInterface Builderに用はないので保存して終了。
Xcodeに戻ってDetailViewControllerの実装に入るわけです。
まずはDetailViewController.mの
viewDidLoad |
のコメントを外して
- (void)viewDidLoad { |
と実装。うりゃっと実行。
ぐあっ!
死にました。
そーなんだよ、FirstController側の呼び出し、UIViewControllerのままじゃんよ。なんてバカだ。DetailViewControllerに修正せんと。
- (void)tableView:(UITableView *)tableView |
こうなんだよ。こう。#import "DetailViewController.h"も忘れんようにね。
うりゃ、ビルドして実行。
![$テン・シー・シー-8](https://stat.ameba.jp/user_images/20091122/22/xcc/fb/fa/j/o0201037010315772895.jpg?caw=800)
でた、アクセス成功
調子のりお。
このままDetailViewControllerにUITableViewDataSourceを継承させてテーブルの内容部も設定したれぃ!
@interface DetailViewController : UIViewController<UITableViewDelegate, |
でも、めんどくさいんで実装するのは以下の3メソッドだけね。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
あとはviewDidLoadでsugestionTableViewのdataSourceとしてselfを設定でおしまい。
- (void)viewDidLoad { |
うりゃっと実行。
![$テン・シー・シー-9](https://stat.ameba.jp/user_images/20091122/22/xcc/25/36/j/o0212037410315796617.jpg?caw=800)
でた
おっしゃあ、景気づけに画像も貼付けてみますか~。とこいつはFirstViewController側のtableView:didSelectRowAtIndexPath:メソッドを拡張して
- (void)tableView:(UITableView *)tableView |
うりゃっと実行。
変化無し...
デバッガで止めて確認。ctl.imageView.imageがnilでした。
ですね。
initWithNibNameの段階じゃViewは作られてないんですな。
ま、ここらへんどうするかと、ちょっと気になるメソッド
- (void)viewDidUnload { |
も含めて以下次回!
------------
サンプルプロジェクト:konohana_test4.zip
ゲット!
![treasure](https://stat.ameba.jp/user_images/20100313/12/xcc/45/65/p/o0162024210449158708.png?caw=800)