6

ナビゲーション バー、テーブル ビュー、およびツールバーを含むビュー コントローラーがあります。ビュー コントローラーに UITableViewDelegate を含め、ストーリーボードを介してテーブルのデータ ソースとデリゲートをビュー コントローラーに正しく割り当てました。テーブル ビューはリモート データベースからデータをロードします。テーブルが最後のセルまでスクロールすると、さらに多くのデータがテーブルにロードされます。次の投稿で概説されているように、 scrollViewDidScroll および indexPathForRowAtPoint メソッドを使用してこれを実現しました: How to know when UITableView did scroll to bottom in iPhone . ただし、アプリを実行してテーブルをスクロールすると、indexPathForRowAtPoint によって返される唯一のインデックス パスは、テーブルの読み込み時に指定されたポイントに配置されたパスです。スクロールしたときに得られるコードと出力は次のとおりです。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint bottomPoint = CGPointMake(160, 430);
    CGPoint topPoint = CGPointMake(160, 10);

    NSLog(@"%d", [[_tableView indexPathForRowAtPoint:bottomPoint] row]);

}

スクロールするたびに、次が出力されます。

2013-06-08 00:56:45.006 Coffee[24493:907] 3
2013-06-08 00:56:45.012 Coffee[24493:907] 3
2013-06-08 00:56:45.040 Coffee[24493:907] 3
2013-06-08 00:56:45.069 Coffee[24493:907] 3
2013-06-08 00:56:45.088 Coffee[24493:907] 3
2013-06-08 00:56:45.105 Coffee[24493:907] 3
2013-06-08 00:56:45.135 Coffee[24493:907] 3
2013-06-08 00:56:45.144 Coffee[24493:907] 3
2013-06-08 00:56:45.173 Coffee[24493:907] 3
2013-06-08 00:56:45.180 Coffee[24493:907] 3

ここで、3 はセルの indexPath.row であり、コントローラーがロードされたときに下のポイントがオンになります。私は何を間違っていますか?なぜこれが起こっているのですか? UITableView が親View Controller内にあるという事実と関係がありますか?

4

4 に答える 4

11

bottomPointはあなたの 内の場所を探していますscrollView。あなたscrollViewにはテーブルが含まれており、すべてのセルは常に同じ場所にありますscrollView。そのため、その時点で常に同じセルを取得します。

スクロールすると、セルは では移動せずscrollViewscrollView親に対して「移動」します。これは、その contentOffset を変更することによって行われます。

scrollView'sy content offset を に追加するbottomPointと、 でおそらく本当に探しているポイントが得られますscrollView

このような:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint bottomPoint = CGPointMake(160, 430) - scrollView.contentOffset.y;
    CGPoint topPoint = CGPointMake(160, 10);

    NSLog(@"%d", [[_tableView indexPathForRowAtPoint:bottomPoint] row]);

}
于 2013-06-08T05:21:28.700 に答える
3

Apple のドキュメントからわかるように、メソッドindexPathForRowAtPoint:はレシーバーのローカル座標系 (テーブル ビューの境界)内のポイントを参照しますが、テーブルビューのフレームは参照しません。設定した bottomPoint はテーブル ビューのフレーム座標系にあるため、正しいindexPath. HalR の答えは、テーブル ビューの境界座標系の bottomPoint を示します。

indexPathForRowAtPoint:

指定されたポイントの行とセクションを識別するインデックス パスを返します。

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point

パラメータ
point: 受信側のローカル座標系のポイント (テーブル ビューの境界)。

戻り値ポイントに関連付けられた行とセクションを表すインデックス パス、または
ポイントnil行の境界外にある場合。

参考までに、フレームとバウンドの違い

于 2013-06-08T07:27:56.607 に答える
0
let bottomPoint = CGPoint(x: tableView.frame.midX, y: tableView.frame.maxY)
let converted = tableView.convert(point, from: tableView.superview)
let indexPathForBottomCell = tableView.indexPathForItem(at: converted)

これもうまくいくはずで、理解しやすいかもしれません。すべての追加スペース (下部インセットなど) は、ケースごとに異なる方法で処理されます。

于 2018-12-19T15:39:05.773 に答える