ユーザーがIBAction
の一番下までスクロールしたときに、UITableView
などのイベントをトリガーする方法はありますか?これが発生した場合、行を追加したいと思います。どうすればよいですか?
単にscrollViewDidScroll:
デリゲートメソッドをリッスンし、コンテンツオフセットを現在の可能なオフセットと比較します。しきい値よりも低い場合は、いくつかのしきい値がメソッドを呼び出してテーブルビューを更新します。新しく追加したデータを確実にリロードするために、[tableView reloadData]
を呼び出すことを忘れないでください。
編集:抽象コードをまとめます。うまくいくかどうかはわかりませんが、うまくいくはずです。
- (void)scrollViewDidScroll: (UIScrollView *)scroll {
// UITableView only moves in one direction, y axis
CGFloat currentOffset = scroll.contentOffset.y;
CGFloat maximumOffset = scroll.contentSize.height - scroll.frame.size.height;
// Change 10.0 to adjust the distance from bottom
if (maximumOffset - currentOffset <= 10.0) {
[self methodThatAddsDataAndReloadsTableView];
}
}
少し遅れない限り、私はより良い解決策を見つけたと思います:
の代わりに
- (void)scrollViewDidScroll: (UIScrollView)scroll
私は使った
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
これははるかに便利です。イベントがトリガーされるのは1回だけだからです。私はアプリケーションでこのコードを使用して、下部のテーブルビューにさらに行をロードしました(おそらく、Facebookアプリケーションからのこのタイプのリロードを認識しています-上部で更新しているという違いのみです)。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
if (maximumOffset - currentOffset <= -40) {
NSLog(@"reload");
}
}
誰かがこれを助けてくれることを願っています。
このスニペットを使用します。 tableView:willDisplayCell:forRowAtIndexPath:
最後のインデックスパスを持つセルが表示されるかどうかを確認します。
1つのセクションを持つtableViewの場合:
[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]
より多くのセクション:
[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:[self numberOfSectionsInTableView:self.tableView]-1]
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!_noMoreDataAvailable)
{
if ([indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]])
{
[self.dataSourceController fetchNewData];
}
}
}
dataSourceControllerをフェッチした後、tableViewデリゲートに通知し、これによりデータが再ロードされます。
それは私が推測するはるかに簡単な方法で達成できます。この場合はユーザーが下にスクロールしているときのように、スクロール方向を決定する必要があるだけです。
まず、.hファイルで変数を宣言します。
CGPoint pointNow;
.mファイルのscrollViewDidScrollメソッドで、このコードを実装する必要があります:-
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > pointNow.y) {
//Enter code here
}
}
これがSwift @ user944351の回答)のバージョン です。
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let currentOffset = scrollView.contentOffset.y
let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height
if maximumOffset - currentOffset <= -40 {
print("reload")
}
}
このメソッドをUITableView
デリゲートクラスに追加するだけです。 -40
が大きすぎることがわかりましたが、必要に応じて調整できます。
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
// Hit Bottom?
if ((currentOffset > 0) && (maximumOffset - currentOffset) <= 10) {
// Hit Bottom !!
}
なぜこれを実行する必要があるのかはわかりませんが、cellForRowAtIndexPath
メソッドにコードを追加して、indexPath.row ==最後の行の場合にメソッドを呼び出して行を追加することができると思います...