web-dev-qa-db-ja.com

下にスクロールしたときにUITableViewに行を追加します

ユーザーがIBActionの一番下までスクロールしたときに、UITableViewなどのイベントをトリガーする方法はありますか?これが発生した場合、行を追加したいと思います。どうすればよいですか?

30
aherlambang

単に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];
     }
}
38
Henri Normak

少し遅れない限り、私はより良い解決策を見つけたと思います:

の代わりに

 - (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");
    }
}

誰かがこれを助けてくれることを願っています。

57
user944351

このスニペットを使用します。 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デリゲートに通知し、これによりデータが再ロードされます。

13
vikingosegundo

それは私が推測するはるかに簡単な方法で達成できます。この場合はユーザーが下にスクロールしているときのように、スクロール方向を決定する必要があるだけです。

まず、.hファイルで変数を宣言します。

CGPoint pointNow;

.mファイルのscrollViewDidScrollメソッドで、このコードを実装する必要があります:-

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > pointNow.y) {
        //Enter code here
    }
}
1
Jas_meet

Swift

これが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が大きすぎることがわかりましたが、必要に応じて調整できます。

より詳しい情報

  • データベースの制限とオフセットを使用してデータを再ロードする方法の例がある 私の完全な回答 を参照してください。
1
Suragch
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

// Hit Bottom?
if ((currentOffset > 0) && (maximumOffset - currentOffset) <= 10) {
   // Hit Bottom !! 
}
1
bi Park

なぜこれを実行する必要があるのか​​はわかりませんが、cellForRowAtIndexPathメソッドにコードを追加して、indexPath.row ==最後の行の場合にメソッドを呼び出して行を追加することができると思います...

0
rekle