提案ビューをkonohana_test.xcodeprojに組み込んで使ってみます。
↑こいつね
呼び出す場所はDetailViewControllerクラスのnewSuggestionメソッド。
一時的にダミー提案するように実装してたところを、ちゃんと提案ビュー出すように変更するわけですわ。
まずkonohana_test.xcodeproj側にNewFlowerNameViewController関連の3ファイルを組み込み。ここらへんわからん人はプロジェクトに既存ファイルを追加するを参照。
下のように、とりあえずのダミー処理を入れてたわけですが、
こいつをNewFlower.xcodeprojのNewFlowerAppDelegateのapplicationDidFinishLaunching:メソッドでやってる処理に置き換えて
ctl.newflowerNameDelegate = self;で自分を移譲先に指定して、NewFlowerNameViewControllerインスタンスから委譲を受け取るわけですわ。
ここも、投稿ビュー(NewFlowerViewController)の委譲プロトコル(NewFlowerViewControllerDelegate)同様に、inNameがnilならキャンセルされたとみなしてます。
とりあえず、実行。
出た出た、名前入力して、あ、改行キー「改行」のままだ「完了」にしとかないと…まあいい、説明も入力できてと…お~けぇ~、 お~けぇ~ネクスッ!
って、しまったあああ
提案ボタン表示するの忘れてるううううう。
急遽NewFlowerNameViewControllerに提案ボタン表示する機能を実装。ただし、表示するのは提案名が入力されてるときだけとしたいので、提案名が入ってるUITextFieldインスタンスを変数として持つようにしますた。
なので、tableView:cellForRowAtIndexPath:でローカル変数として処理してたUITextFieldインスタンスを
としてインスタンス変数に昇格。「提案」ボタンを設定するshowSuggestionButtonメソッドでは、このnameViewの入力テキストを調べる事でボタンを付けるか付けないか決定しとりとります。
あとは、テキスト入力終了時に呼ばれるメソッドtextFieldShouldReturn:とnameDescriptionDone:でshowSuggestionButtonを呼ぶようにしておしまい。
出ました。
提案名を空にするとボタンも消える。オッケー。
んじゃ「提案」!
で、またひとつ気づいたけど
で閉じるんだね。てっきり
ってしないと駄目と思ってた。リファレンスに
って書いとるがな。よく読めよ俺、みたいな。
無事追加~。
で、まあ、ここまでやったら、いくとこまでいっちゃえってわけで…
残りのタブも対応しちゃえ~。
で、なんでこいつらが空のテーブルビューのままなのかというとMainWindow.xibの設定がUITableViewControllerのままだからです。なので、こいつをFirstViewControllerにしてやればいいわけですよ。
変更したいUITableViewControllerを選んでおいてTools>Inspectorメニュー、出てきたウィンドウでIdentityタブをクリック。表示されるビューのClassをFirstViewControllerに変更。
これでビルドして実行すれば
はい表示。
ただ~し。
気づいてると思うけど「すべて」タブに表示されてる項目と違う項目なんですよ。
なんでかっていうと、タブごとにFirstViewControllerインスタンスが作られるんで、その中で作ってるKonohanaDBインスタンスもタブごとにできちゃうからなんですな。
最終的なネットワーク先のデータベース呼び出し版では、呼び出し先が一つなんで、この状態でも一致するようになるとは思うんですが…
ダミー版では自分のNSMutableArrayを作って使ってるので別々になっちゃうわけです。
ここらへんもちゃんとエミュレートしようということで、ちょこっとKonohanaDBクラスを変更します。
こんな感じで、ひとつのNSMutableArrayを共有します。
こいつと、あと、ちょっと一工夫することで、自分の投稿だけ表示するタブの完成ですわ。
ま、
「自分の投稿」タブ側では問-52が消えてる事に注目
自分の投稿かどうかは「すべて」タブ側で編集ボタンを押して削除ボタンが出るか出ないかでわかる
ここらへんの説明は次回!
サンプルソースは実装済みなので、土日余裕がある人は解析だ~。
------------
サンプルプロジェクト:konohana_test20.zip
↑こいつね
呼び出す場所はDetailViewControllerクラスのnewSuggestionメソッド。
一時的にダミー提案するように実装してたところを、ちゃんと提案ビュー出すように変更するわけですわ。
まずkonohana_test.xcodeproj側にNewFlowerNameViewController関連の3ファイルを組み込み。ここらへんわからん人はプロジェクトに既存ファイルを追加するを参照。
下のように、とりあえずのダミー処理を入れてたわけですが、
- (void)newSuggestion {
// とりあえずの処理。最終的にモーダルビュー表示。
static int index = 1;
[db addSuggestion:contributeID
name:[NSString stringWithFormat:@"test-%d", index++]
comment:@"提案"];
[result removeAllObjects];
[db connectForSuggestion:contributeID];
}
// とりあえずの処理。最終的にモーダルビュー表示。
static int index = 1;
[db addSuggestion:contributeID
name:[NSString stringWithFormat:@"test-%d", index++]
comment:@"提案"];
[result removeAllObjects];
[db connectForSuggestion:contributeID];
}
こいつをNewFlower.xcodeprojのNewFlowerAppDelegateのapplicationDidFinishLaunching:メソッドでやってる処理に置き換えて
- (void)newSuggestion {
NewFlowerNameViewController* ctl =
[[NewFlowerNameViewController alloc]
initWithNibName:@"NewFlowerNameViewController" bundle:nil];
ctl.image = image;
ctl.comment = comment;
ctl.newflowerNameDelegate = self;
// ナビゲーションコントローラ
UINavigationController* naviCon = [[UINavigationController alloc]
initWithRootViewController:ctl];
// モーダルビューとして表示。
[self presentModalViewController:naviCon animated:YES];
// presentModalViewControllerでcontroller側の管理下に入った。そのため
// こちらでは管理する必要がなくなったので解放する。
[ctl release];
[naviCon release];
}
NewFlowerNameViewController* ctl =
[[NewFlowerNameViewController alloc]
initWithNibName:@"NewFlowerNameViewController" bundle:nil];
ctl.image = image;
ctl.comment = comment;
ctl.newflowerNameDelegate = self;
// ナビゲーションコントローラ
UINavigationController* naviCon = [[UINavigationController alloc]
initWithRootViewController:ctl];
// モーダルビューとして表示。
[self presentModalViewController:naviCon animated:YES];
// presentModalViewControllerでcontroller側の管理下に入った。そのため
// こちらでは管理する必要がなくなったので解放する。
[ctl release];
[naviCon release];
}
ctl.newflowerNameDelegate = self;で自分を移譲先に指定して、NewFlowerNameViewControllerインスタンスから委譲を受け取るわけですわ。
-(void)newFlowerName:(NSString*) inName
comment:(NSString*)inComment {
if (inName) {
[db addSuggestion:contributeID name:inName comment:inComment];
[result removeAllObjects];
[db connectForSuggestion:contributeID];
}
[self dismissModalViewControllerAnimated:YES];
}
comment:(NSString*)inComment {
if (inName) {
[db addSuggestion:contributeID name:inName comment:inComment];
[result removeAllObjects];
[db connectForSuggestion:contributeID];
}
[self dismissModalViewControllerAnimated:YES];
}
ここも、投稿ビュー(NewFlowerViewController)の委譲プロトコル(NewFlowerViewControllerDelegate)同様に、inNameがnilならキャンセルされたとみなしてます。
ctl.newflowerNameDelegate = self;でワーニングが出ないように@interface DetailViewController宣言でNewFlowerNameViewControllerDelegateプロトコルを継承しておくのは当然。
とりあえず、実行。
出た出た、名前入力して、あ、改行キー「改行」のままだ「完了」にしとかないと…まあいい、説明も入力できてと…お~けぇ~、 お~けぇ~ネクスッ!
って、しまったあああ
提案ボタン表示するの忘れてるううううう。
急遽NewFlowerNameViewControllerに提案ボタン表示する機能を実装。ただし、表示するのは提案名が入力されてるときだけとしたいので、提案名が入ってるUITextFieldインスタンスを変数として持つようにしますた。
なので、tableView:cellForRowAtIndexPath:でローカル変数として処理してたUITextFieldインスタンスを
@interface NewFlowerNameViewController : UITableViewController
<UITextViewDelegate, UITextFieldDelegate> {
・
UITextField* nameView;
・
<UITextViewDelegate, UITextFieldDelegate> {
・
UITextField* nameView;
・
ついでにワーニング消しのためにUITextViewDelegate, UITextFieldDelegateを継承した。
としてインスタンス変数に昇格。「提案」ボタンを設定するshowSuggestionButtonメソッドでは、このnameViewの入力テキストを調べる事でボタンを付けるか付けないか決定しとりとります。
-(void)suggestion:(id)sender {
if ([newflowerNameDelegate respondsToSelector:
@selector(newFlowerName:comment:)]) {
[newflowerNameDelegate
newFlowerName:nameView.text
comment:nameDescription.text];
} else {
[self dismissModalViewControllerAnimated:YES];
}
}
//「提案」ボタンを設定する
- (void)showSuggestionButton {
if (nameView.text && nameView.text.length > 0) {
UIBarButtonItem *doneButton =
[[UIBarButtonItem alloc] initWithTitle:@"提案"
style:UIBarButtonItemStyleDone target:self action:@selector(suggestion:)];
self.navigationItem.rightBarButtonItem = doneButton;
[doneButton release];
} else {
self.navigationItem.rightBarButtonItem = nil;
}
}
if ([newflowerNameDelegate respondsToSelector:
@selector(newFlowerName:comment:)]) {
[newflowerNameDelegate
newFlowerName:nameView.text
comment:nameDescription.text];
} else {
[self dismissModalViewControllerAnimated:YES];
}
}
//「提案」ボタンを設定する
- (void)showSuggestionButton {
if (nameView.text && nameView.text.length > 0) {
UIBarButtonItem *doneButton =
[[UIBarButtonItem alloc] initWithTitle:@"提案"
style:UIBarButtonItemStyleDone target:self action:@selector(suggestion:)];
self.navigationItem.rightBarButtonItem = doneButton;
[doneButton release];
} else {
self.navigationItem.rightBarButtonItem = nil;
}
}
あとは、テキスト入力終了時に呼ばれるメソッドtextFieldShouldReturn:とnameDescriptionDone:でshowSuggestionButtonを呼ぶようにしておしまい。
出ました。
提案名を空にするとボタンも消える。オッケー。
んじゃ「提案」!
NewFlowerNameViewController.m修正してて気づいたんだけどcancelModalメソッド側、newFlowerName:comment:じゃなくnewFlower:comment:ってやってますた。修正ね。
- (void)cancelModal {
if ([newflowerNameDelegate respondsToSelector:@selector(newFlowerName:comment:)]) {
[newflowerNameDelegate newFlowerName:nil comment:nil];
} else {
[self dismissModalViewControllerAnimated:YES];
}
}
if ([newflowerNameDelegate respondsToSelector:@selector(newFlowerName:comment:)]) {
[newflowerNameDelegate newFlowerName:nil comment:nil];
} else {
[self dismissModalViewControllerAnimated:YES];
}
}
で、またひとつ気づいたけど
[self dismissModalViewControllerAnimated:YES];
で閉じるんだね。てっきり
[self.parentViewController dismissModalViewControllerAnimated:YES];
ってしないと駄目と思ってた。リファレンスに
If you call this method on the modal view controller itself, however, the modal view controller automatically forwards the message to its parent view controller.
って書いとるがな。よく読めよ俺、みたいな。
無事追加~。
で、まあ、ここまでやったら、いくとこまでいっちゃえってわけで…
残りのタブも対応しちゃえ~。
で、なんでこいつらが空のテーブルビューのままなのかというとMainWindow.xibの設定がUITableViewControllerのままだからです。なので、こいつをFirstViewControllerにしてやればいいわけですよ。
変更したいUITableViewControllerを選んでおいてTools>Inspectorメニュー、出てきたウィンドウでIdentityタブをクリック。表示されるビューのClassをFirstViewControllerに変更。
これでビルドして実行すれば
はい表示。
ただ~し。
気づいてると思うけど「すべて」タブに表示されてる項目と違う項目なんですよ。
なんでかっていうと、タブごとにFirstViewControllerインスタンスが作られるんで、その中で作ってるKonohanaDBインスタンスもタブごとにできちゃうからなんですな。
最終的なネットワーク先のデータベース呼び出し版では、呼び出し先が一つなんで、この状態でも一致するようになるとは思うんですが…
ダミー版では自分のNSMutableArrayを作って使ってるので別々になっちゃうわけです。
ここらへんもちゃんとエミュレートしようということで、ちょこっとKonohanaDBクラスを変更します。
こんな感じで、ひとつのNSMutableArrayを共有します。
こいつと、あと、ちょっと一工夫することで、自分の投稿だけ表示するタブの完成ですわ。
ま、
「すべて」タブを詳細ビューにし、そのまま、「自分の投稿」タブに切り替えて、そこで「すべて」タブの詳細に表示していた項目を削除した後「すべて」タブに切り替えて戻られた
場合なんかの処理は未実装だけどね。「自分の投稿」タブ側では問-52が消えてる事に注目
自分の投稿かどうかは「すべて」タブ側で編集ボタンを押して削除ボタンが出るか出ないかでわかる
ここらへんの説明は次回!
サンプルソースは実装済みなので、土日余裕がある人は解析だ~。
------------
サンプルプロジェクト:konohana_test20.zip