大丈夫だ問題ない。

 もう、このネタ自体が古くなってしまうくらい間があいてしまった。
 まずは、「もっと見る」を選ぶと、下から同じページが出る問題から。

$テン*シー*シー-1

 すると

$テン*シー*シー-15

 この状態になる問題ね。

 で、なんでかなーとデバッガで確認する事に。
 KonohanaDBNet.mを開いてconnect:forword:メソッドでブレークしてみる事にしました。

$テン*シー*シー-2

 これで「ビルドとデバッグ」ボタンを押すか、ビルド>ビルドとデバッグーブレークポイント入メニューを選べば、デバッグモードに入る。
 最初の停止時は、もちろん先頭ページ読み込みなんで引数inIDには-1が入ってるわけだ。まあ、こいつは問題ない。

$テン*シー*シー-3

 しまった~、本では正統派ストロングスタイルのデバッガ表示側を紹介したけど、上のショートカット紹介し忘れた。スレッドリストの紹介にばっか気が行ってた…
 ま、まあ、気づくよね。すまそ。
 正統派はこんな感じでデバッガウィンドウ開いて変数を観察。
 
テン*シー*シー-4

 うむうむ確かに-1になっとるわ。

テン*シー*シー-6

 で「実行を続けます」ボタンを押して、次の「手を離すと更新します。」させた時にどうなるか確認。

$テン*シー*シー-7

 むう、8かよ…
 あってるかどうかわからんザマス。fowrodはNOでいい。

$テン*シー*シー-8

 ま、こういう時のためにSafariからも試せるようにしてたわけですわ。ここで作られるURLを直接SafariでURLとして打ち込めば、iPhoneに返される内容がはっきりわかるぞっと、さてさてforwordがNOの時は、っとアレ?
if (inID == -1) {
page = @"";
} else {
if (forword) {
page = [NSString stringWithFormat:@"?top_id=%d", inID];
} else {
page = [NSString stringWithFormat:@"?top_id=%d", inID];
}
}

 って、どっちも"top_id="にしてたわー。
 なんのためにメソッドのコメントに例題書いてたんだか…
/*
http://localhost/konohana/mainlist.php?top_id=13
http://localhost/konohana/mainlist.php?bottom_id=14
*/
-(void)connect:(int)inID forword:(BOOL)forword {

 まあ、そんなわけで「下からチュンリーが再会(サイチェン)」問題は解決。もしかして提案側でも同じ事やってんのかとconnectForSuggestion:suggestion:forword:メソッド調べたら、案の定やってました。
if (forword) {
page = [NSString stringWithFormat:@"&top_id=%d&vote_count=%d", inID, 1];
} else {
page = [NSString stringWithFormat:@"&top_id=%d&vote_count=%d", inID, 1];
}

 なにやってんの、ジェガン部隊は~(最近ブルーレーで見ますた)
 
 でも、完全に治らないのよ。なぜか更新するたびに、下に1項目追加されていく。

$テン*シー*シー-10
「たんぽぽ」がどんどん増える

 Safari側だと同じURLで読み込んでも、項目は無いんだけど…

$テン*シー*シー-11

 というところで、気づきました。

$テン*シー*シー-12

 「たんぽぽ」表示してるじゃん。
 そうなんだよ、投票数トップは常時表示なんで、サーバーから返されるどのページも必ず投票数トップ項目が入ってくるんだよ。

 なので、提案に関してはinIDが-1以外の時は先頭の項目は無視するようにしないと駄目なのねん。
BOOL firstItem = YES;
for (id dic in parser_suggestion.list) {
if ((inID != -1) && (firstItem == YES)) {
firstItem = NO;
continue;
}

[self handleArrivedSuggestion:[[dic valueForKey:@"ID"] intValue]
name:[dic valueForKey:@"name"]
comment:@""
vote:[[dic valueForKey:@"vote"] intValue]];
}

 これでOK。

 あと、項目が少ないとフッターが見えてしまうのを見えないようにします。

$テン*シー*シー-13

 って、ここまで書いて重大な事に~
 以前その(196)のコメントでrelaxumaさんに聞かれてたの、この事だったのね…
 なんか完全に’勘違いしてその(198)を見るといいですよって返事してたけど「いつでも引っ張りだされてる状態が成り立つ問題」じゃなく「いつでも引っ張りだされて見えてる問題」についての質問だったのね。

 アー、勘違いしてた。
 relaxumaさんリンク無いから連絡できないよ。
 もし見てたら今回のソースを参考にしてください。
 私がやったのは、以下のように透明なUIViewを挟む方法です。

$テン*シー*シー-13

 具体的にはUpdateTriggerのadapteTrigger:メソッドをちょい修正し、透明なUIView(baseFotter)をtableView.tableFooterViewに指定しています。
-(void)adapteTrigger:(UITableView*)inTableView {


// 末尾
r = tableView.bounds;
r.origin.y = 0;
r.size.height = 40;
// 透明なフッタービューを用意
UIView* baseFotter = [[UIView alloc] initWithFrame:r];

triggerFooter = [[UILabel alloc] initWithFrame:r];
triggerFooter.textAlignment = UITextAlignmentCenter;
triggerFooter.text = @"もっと見る";
// triggerFooterは透明なフッタービューの底辺にひっつくように指定しaddSubviewする
triggerFooter.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
[baseFotter addSubview:triggerFooter];
// 透明なフッタービューを指定
tableView.tableFooterView = baseFotter;
[baseFotter release];



 あとは
-(void)adjust:(CGFloat)contentsHeight {
CGRect frame = tableView.tableFooterView.frame;
frame.size.height = tableView.frame.size.height - contentsHeight;
if (frame.size.height < 40)
frame.size.height = 40;
tableView.tableFooterView.frame = frame;
UIView* v = tableView.tableFooterView;
[v retain];
tableView.tableFooterView = nil;
tableView.tableFooterView = v;
[v release];
}

 てな具合に透明なフッタービューの高さを、テーブル項目の高さにあわせて調整するメソッドを用意してUITableViewのreloadDataを呼び出すところで呼び出すようにしてます。
 DetailViewControllerなら
// 接続完了。
-(void)terminate {
if ([result count] > 0) {
Suggestion* instance = [result objectAtIndex:0];
self.title = instance.name;
}
[updateTrigger adjust:[result count] * 44.0];
[sugestionTableView reloadData];
}

 それと当然scrollViewDidScroll:メソッドでの座標計算は透明ビューを考慮したものにする。
double triggerTail = triggerFooter.superview.frame.origin.y + triggerFooter.frame.origin.y + triggerFooter.frame.size.height;

 これで、項目が少なくても「もっと見る」フッターは見えなくなるわけです。実際は透明なフッターが見えてるんですけどね。

$テン*シー*シー-14

 以上、ひさびさのiPhoneアプリ開発でした~。

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