前回、ソースの中に
navigationBar.bounds.size.height;

 てのがまぎれてて、あれっと思った人いると思うけど、取り忘れです。

 あそこから推理して

$テン・シー・シー-1

 てやるつもりだろ?って思ってた人。
 大正解。

 ナブゲーションバー用意するくらいなら、最初からモーダルビューじゃなくナビゲーションバーにプッシュして表示した方がいいんじゃね?

 それも、ごもっとも。
 あくまでモーダルビューにこだわるなら、下みたいに「閉じる」ボタンを用意するのがシンプルでいいんじゃないかとも思うんですが~

$テン・シー・シー-1

 習作なんでね、
 モーダルビューでナビゲーションバー付けられるのかってのを確認もしたかったのでナビゲーションバー付けてみます。

 まずは、NewFlowerViewController.hでメソッド内でアクセスできるようにナビゲーションバーのIBOutletを用意。
@interface NewFlowerViewController : UIViewController {
IBOutlet UITextView* commentView;
IBOutlet UINavigationBar* navigationBar;
CGRect savedFrame;
}

 ここで注意するのは、今回追加するnavigationBarアウトレットとUIViewControllerに存在するnavigationControllerプロパティとの混同。

 まずnavigationControllerはコントローラであってビューであるUINavigationBarではない。
 次にnavigationControllerは上位からのpushViewController:animated:メッセージで自分がナビゲーションコントローラの配下に入った時に有効な値で、そうでなければnilであるということ。
 関連するnavigationItemプロパティ(むしろ、こっちと混同しやすいか?)も、このnavigationControllerに付随するもの。

 ということ。
 ここらへんも実験してみるとして、上記IBOutlet UINavigationBar* navigationBarの定義を終えてNewFlowerViewController.hを保存したならNewFlowerViewController.xibをInterface Builderで開いてナビゲーションバーを貼りはり。

$テン・シー・シー-2

 さっき用意したnavigationBarアウトレットが表示されるので貼付けたナビゲーションバーを指定したらInterface Builderは終了してXcodeで

- (void)keyboardWasShown:(NSNotification*)aNotification { 


// テキスト入力完了通知用ボタンを用意。
UIBarButtonItem *doneButton =
[[UIBarButtonItem alloc] initWithTitle:@"入力完了"
style:UIBarButtonItemStyleDone target:self
action:@selector(commentDone:)];
UINavigationItem* item = [navigationBar.items objectAtIndex:0];
item.rightBarButtonItem = doneButton;
[doneButton release];
}

-(void)commentDone :(id)sender {
[commentView resignFirstResponder];
UINavigationItem* item = [navigationBar.items objectAtIndex:0];
item.rightBarButtonItem = nil;
}

 というようにUIBarButtonItemを作ってnavigationBarの右側のボタンとして配置。
 ここで悩んだのがボタンを配置できるのはUINavigationBarインスタンスにじゃなくてUINavigationItemインスタンスにっていうこと。
 どこにあるんだ?
 とUINavigationBarのリファレンス見てみるとitemsプロパティの一番最初のインスタンスがUINavigationItemインスタンスだよっとの事。
 これがUINavigationItem* item = [navigationBar.items objectAtIndex:0];て処理なわけです。

 で、ボタンを押された時に呼び出されるメソッドとして-(void)commentDone :(id)senderを準備。commentViewにresignFirstResponderメッセージを送る事で、自分がキーボード入力対象から抜けますと宣言。これでキーボードが隠れます。
 当然一緒に「入力完了ボタン」も消えてもらいたいのでitem.rightBarButtonItem = nil;としてます。rightBarButtonItemはプロパティでretainとなってるので、nilを設定すれば、元々のボタンはreleaseされるんですな。プロパティがretain?な人は「iPhoneアプリ開発、号外 propertyをちょっと調べてみた」を読みましょう(うおおお、このページ、号外なんで目次に乗せてなかったけど意外に重要だわ。もはやブログ内検索もできなくなってるし...)。

 うりゃあと実行。
$テン・シー・シー-3

 げええええええ

 というわけで、最初の
	viewFrame.origin.y = navigationBar.bounds.size.height;

 になるぞと、チャンチャン。

$テン・シー・シー-4

 ふう。

$テン・シー・シー-7

 おっしゃあ、スクロールもOKだ!

 あとはkonohna_testプロジェクトに
NewFlowerViewController.h
NewFlowerViewController.m
NewFlowerViewController.xib

 の3つのファイルを登録。

$テン・シー・シー-8

 登録する時に出てくるダイアログは特にいじる必要はないです。

$テン・シー・シー-9
こんな感じならOK

 これでファイルが追加される。

$テン・シー・シー-10

 あとは
ContributionViewController

 を
NewFlowerViewController

 に差し替えるためにFirstViewController.hとFirstViewController.mを修正。
 ぶっちゃけContributionViewControllerて文字列をNewFlowerViewControllerに置き換えるだけですわ。

 おっと、キャンセルボタン、投稿ボタンの対応を忘れるとモーダルビューから戻れね~。ContributionViewControllerのソースからコピペでいいです。

NewFlowerViewController.h
- (IBAction)dismissAction:(id)sender;

NewFlowerViewController.m
- (IBAction)dismissAction:(id)sender
{
[self.parentViewController dismissModalViewControllerAnimated:YES];
}


 またまたNewFlowerViewController.xibをInterface Builderで開いて、さっきのdismissActionを呼び出すようにキャンセルボタンを設定。

テン・シー・シー-11

 dismissActionを呼び出すきっかけはTouch Up Inside(ボタン内で指が離れた)が妥当でしょう。

テン・シー・シー-12

 投稿ボタンにも同じ事を繰り返す。

$テン・シー・シー-13

 IBActionは多重リンク可能なんで問題ナッシング。

$テン・シー・シー-14
こんな感じ

 ただし、どっちから呼ばれたかは判断できるようにしたいので「キャンセルボタン」のtagには1、「投稿ボタン」のtagには2を設定しときます。tagってなんすか?な人はテン・シー・シーブログ「iPhoneアプリ開発 目次」、「iPhoneアプリ開発 目次2」に次ぐアクセスランカー第3位「その(33)」を読むべし。

$テン・シー・シー-15

 ばっちり動きました。
 次回は「その(148)」でやったカメラ機能を搭載じゃい!
 ではでは。

------------
サンプルプロジェクト:konohana_test10.zip