前回の更新機能をこの花は?にも実装するわけですが、
![$テン*シー*シー-1](https://stat.ameba.jp/user_images/20100331/00/xcc/66/05/j/o0416027810474521632.jpg?caw=800)
UITableViewを持つFirstViewController、DetailViewController、CoDetailViewControlleごとに前回のRootViewControllerでやった実装をコピペするのも効率悪いんで
ってクラスを新規に用意してこいつに面倒見させる事にします。
でもって、最終的にユーザーによってアップデートが指示された場合はdelegate経由でコントローラ側に通知させるようにするわけです。
例えばFirstViewControllerにUpdateTriggerを加えて、更新機能を実装するには以下のようにviewDidLoadメソッドでのUpdateTriggerインスタンスの作成と設定をしておき
あとはUIScrollViewDelegateのインスタンスメソッドを実装しておいて、上記UpdateTriggerインスタンスに連絡してやれば、アップデートが指定された場合はUpdateTriggerDelegateのupdate:メソッドを呼び出してくれるってわけです。
![$テン*シー*シー-2](https://stat.ameba.jp/user_images/20100331/00/xcc/c4/c9/j/o0467037810474585865.jpg?caw=800)
ま、結局上記の処理はFirstViewController、DetailViewController、CoDetailViewControlleで実装しないといかんのでコピペは使うんですが…
それでもこうしておけば、なにか前回の機能に不具合が見つかった場合でもUpdateTriggerクラス側だけ対応すればいいってことになるわけですわ。
UpdateTrigger側の実装は基本、前回と同じです。
前回は単に表示するだけだったのが、今回は手がはなされた時に更新モードならdelegateを呼び出すように変更しとります。
詳細はサンプルーソースUpdateTrigger.m/hと前回のソース RootViewController.m/hを見比べてください。
最終的に呼び出されるUpdateTriggerDelegateのメソッドではfowordがYESの場合は、いままでと同じくdbにconnectメッセージを送ってのテーブル更新。
NOの場合はテーブルの最後尾にある項目より以前に投稿された項目があるかをKonohanaDBインスタンスにconnect:forword:メッセージを送ってのテーブル更新。
KonohanaDBのconnectやconnect:forword:メソッドは、今までは全項目を返していたんすけど、今回からCOUNT_PAR_PAGE = 5だけ返すようにしてます。これがページングね。
forwordがYESなら指定されたIDより後に投稿された記事を5項目返し
![テン*シー*シー-3](https://stat.ameba.jp/user_images/20100331/00/xcc/89/c7/j/o0219017710474587611.jpg?caw=800)
forwordがNOなら指定されたIDより前に投稿された記事を5項目返すようにしてる。
![テン*シー*シー-4](https://stat.ameba.jp/user_images/20100331/00/xcc/ef/6a/j/o0211017510474587613.jpg?caw=800)
これに伴って、今まではランダムに作成した投稿や、提案、支持をaddObjでNSArrayに追加していたんだけど、これだとIDが大きい方が配列の後ろにきちゃうことになって、上の並びと矛盾しちゃうので、addObjはやめてinsertObject:atIndexで絶えず配列の先頭に最後に作成した投稿や、提案、支持を割り込ませるようにしてます。
それと
てメソッドを追加して、connectやconnect:forwordメソッドが呼ばれるたびに呼び出してます。こいつはランダムに投稿や、提案、支持を追加したり、削除したりするようにしてて、ネットワーク上のデーアベースが複数の人間に同時に変更される状況をエミュレートしてるわけです。
ページング機能も付いて、ネットワークアプリっぽくなってきましたな。
![テン*シー*シー-5](https://stat.ameba.jp/user_images/20100331/00/xcc/4b/6d/j/o0343052410474596040.jpg?caw=800)
ただし、項目が2項目くらいしかなくて画面に収まっちゃう場合、上下、どっちの更新もかかっちゃうんだよね~。
![テン*シー*シー-6](https://stat.ameba.jp/user_images/20100331/00/xcc/83/4f/j/o0225039510474596046.jpg?caw=800)
ここらへんの対応は次回!
------------
サンプルプロジェクト:konohana_test21.zip
![$テン*シー*シー-1](https://stat.ameba.jp/user_images/20100331/00/xcc/66/05/j/o0416027810474521632.jpg?caw=800)
UITableViewを持つFirstViewController、DetailViewController、CoDetailViewControlleごとに前回のRootViewControllerでやった実装をコピペするのも効率悪いんで
@interface UpdateTrigger : NSObject
ってクラスを新規に用意してこいつに面倒見させる事にします。
でもって、最終的にユーザーによってアップデートが指示された場合はdelegate経由でコントローラ側に通知させるようにするわけです。
@protocol UpdateTriggerDelegate<NSObject>
-(void)update:(BOOL)foword;
@end
-(void)update:(BOOL)foword;
@end
基本的なdelegateの定義方法や呼び出し方については、モーダルビューを表示する(2)で説明してるのでそっちを参照。
例えばFirstViewControllerにUpdateTriggerを加えて、更新機能を実装するには以下のようにviewDidLoadメソッドでのUpdateTriggerインスタンスの作成と設定をしておき
- (void)viewDidLoad {
・
updateTrigger = [[UpdateTrigger alloc] init];
[updateTrigger adapteTrigger:self.tableView];
updateTrigger.delegte = self;
・
・
updateTrigger = [[UpdateTrigger alloc] init];
[updateTrigger adapteTrigger:self.tableView];
updateTrigger.delegte = self;
・
あとはUIScrollViewDelegateのインスタンスメソッドを実装しておいて、上記UpdateTriggerインスタンスに連絡してやれば、アップデートが指定された場合はUpdateTriggerDelegateのupdate:メソッドを呼び出してくれるってわけです。
![$テン*シー*シー-2](https://stat.ameba.jp/user_images/20100331/00/xcc/c4/c9/j/o0467037810474585865.jpg?caw=800)
- (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];
}
[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];
}
}
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](https://stat.ameba.jp/user_images/20100331/00/xcc/89/c7/j/o0219017710474587611.jpg?caw=800)
forwordがNOなら指定されたIDより前に投稿された記事を5項目返すようにしてる。
![テン*シー*シー-4](https://stat.ameba.jp/user_images/20100331/00/xcc/ef/6a/j/o0211017510474587613.jpg?caw=800)
これに伴って、今まではランダムに作成した投稿や、提案、支持をaddObjでNSArrayに追加していたんだけど、これだとIDが大きい方が配列の後ろにきちゃうことになって、上の並びと矛盾しちゃうので、addObjはやめてinsertObject:atIndexで絶えず配列の先頭に最後に作成した投稿や、提案、支持を割り込ませるようにしてます。
それと
-(void)dummyAction
てメソッドを追加して、connectやconnect:forwordメソッドが呼ばれるたびに呼び出してます。こいつはランダムに投稿や、提案、支持を追加したり、削除したりするようにしてて、ネットワーク上のデーアベースが複数の人間に同時に変更される状況をエミュレートしてるわけです。
ページング機能も付いて、ネットワークアプリっぽくなってきましたな。
![テン*シー*シー-5](https://stat.ameba.jp/user_images/20100331/00/xcc/4b/6d/j/o0343052410474596040.jpg?caw=800)
ただし、項目が2項目くらいしかなくて画面に収まっちゃう場合、上下、どっちの更新もかかっちゃうんだよね~。
![テン*シー*シー-6](https://stat.ameba.jp/user_images/20100331/00/xcc/83/4f/j/o0225039510474596046.jpg?caw=800)
ここらへんの対応は次回!
------------
サンプルプロジェクト:konohana_test21.zip