前回の更新機能をこの花は?にも実装するわけですが、

$テン*シー*シー-1

 UITableViewを持つFirstViewController、DetailViewController、CoDetailViewControlleごとに前回のRootViewControllerでやった実装をコピペするのも効率悪いんで
@interface UpdateTrigger : NSObject

 ってクラスを新規に用意してこいつに面倒見させる事にします。
 でもって、最終的にユーザーによってアップデートが指示された場合はdelegate経由でコントローラ側に通知させるようにするわけです。
@protocol UpdateTriggerDelegate<NSObject>
-(void)update:(BOOL)foword;
@end

 基本的なdelegateの定義方法や呼び出し方については、モーダルビューを表示する(2)で説明してるのでそっちを参照。

 例えばFirstViewControllerにUpdateTriggerを加えて、更新機能を実装するには以下のようにviewDidLoadメソッドでのUpdateTriggerインスタンスの作成と設定をしておき
- (void)viewDidLoad {

updateTrigger = [[UpdateTrigger alloc] init];
[updateTrigger adapteTrigger:self.tableView];
updateTrigger.delegte = self;


 あとはUIScrollViewDelegateのインスタンスメソッドを実装しておいて、上記UpdateTriggerインスタンスに連絡してやれば、アップデートが指定された場合はUpdateTriggerDelegateのupdate:メソッドを呼び出してくれるってわけです。

$テン*シー*シー-2
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
[updateTrigger scrollViewWillBeginDragging:scrollView];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[updateTrigger scrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
[updateTrigger scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}

 ま、結局上記の処理はFirstViewController、DetailViewController、CoDetailViewControlleで実装しないといかんのでコピペは使うんですが…
 それでもこうしておけば、なにか前回の機能に不具合が見つかった場合でもUpdateTriggerクラス側だけ対応すればいいってことになるわけですわ。

 UpdateTrigger側の実装は基本、前回と同じです。
 前回は単に表示するだけだったのが、今回は手がはなされた時に更新モードならdelegateを呼び出すように変更しとります。
 詳細はサンプルーソースUpdateTrigger.m/hと前回のソース RootViewController.m/hを見比べてください。

 最終的に呼び出されるUpdateTriggerDelegateのメソッドではfowordがYESの場合は、いままでと同じくdbにconnectメッセージを送ってのテーブル更新。
 NOの場合はテーブルの最後尾にある項目より以前に投稿された項目があるかをKonohanaDBインスタンスにconnect:forword:メッセージを送ってのテーブル更新。
 
この場合、テーブル項目は今の項目への追加となるので[result removeAllObjects]をしていない事に注意。

-(void)update:(BOOL)foword {
db.dbDelegate = self;
int ID = 0;
if ([result count]) {
Contribute* instance = [result objectAtIndex:[result count] - 1];
ID = instance.ID;
}
if (foword || (ID == 0)) {
[result removeAllObjects];
[db connect];
} else {
[db connect:ID forword:NO];
}
}

 KonohanaDBのconnectやconnect:forword:メソッドは、今までは全項目を返していたんすけど、今回からCOUNT_PAR_PAGE = 5だけ返すようにしてます。これがページングね。

 forwordがYESなら指定されたIDより後に投稿された記事を5項目返し

テン*シー*シー-3

 forwordがNOなら指定されたIDより前に投稿された記事を5項目返すようにしてる。

テン*シー*シー-4

 これに伴って、今まではランダムに作成した投稿や、提案、支持をaddObjでNSArrayに追加していたんだけど、これだとIDが大きい方が配列の後ろにきちゃうことになって、上の並びと矛盾しちゃうので、addObjはやめてinsertObject:atIndexで絶えず配列の先頭に最後に作成した投稿や、提案、支持を割り込ませるようにしてます。
 それと
-(void)dummyAction

 てメソッドを追加して、connectやconnect:forwordメソッドが呼ばれるたびに呼び出してます。こいつはランダムに投稿や、提案、支持を追加したり、削除したりするようにしてて、ネットワーク上のデーアベースが複数の人間に同時に変更される状況をエミュレートしてるわけです。

 ページング機能も付いて、ネットワークアプリっぽくなってきましたな。

テン*シー*シー-5

 ただし、項目が2項目くらいしかなくて画面に収まっちゃう場合、上下、どっちの更新もかかっちゃうんだよね~。

テン*シー*シー-6

 ここらへんの対応は次回!

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