滚动到底部时,向UITableView添加行

时间:2011-05-16 21:29:42

标签: objective-c cocoa-touch ios uitableview

当用户滚动到IBAction的底部时,是否有办法触发事件,例如使用UITableView?如果发生这种情况,我想添加更多行。我该怎么做?

7 个答案:

答案 0 :(得分:57)

除非有点晚,但我认为我找到了更好的解决方案:

而不是

 - (void)scrollViewDidScroll: (UIScrollView)scroll

我用过

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

这样更方便,因为事件只触发一次。 我在我的应用程序中使用此代码在我的tableview底部加载更多行(也许你从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");
    }
}

希望有人能帮到你。

答案 1 :(得分:38)

只需听取scrollViewDidScroll:委托方法,将内容偏移量与当前可能的偏移量进行比较,如果低于某个阈值则调用您的方法来更新tableview。不要忘记致电[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];
     }
}

答案 2 :(得分:14)

我使用此代码段。在tableView:willDisplayCell:forRowAtIndexPath:中检查,如果具有最后一个索引路径的单元格即将被显示。

对于包含一个部分的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委托,这将重新加载数据。

答案 3 :(得分:1)

NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

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

答案 4 :(得分:1)

我可以用更简单的方式实现,你只需要确定滚动方向,就像在这种情况下用户向下滚动一样。

首先在你的.h文件中声明一个变量:

CGPoint pointNow;

在.m文件中,在scrollViewDidScroll方法中我们需要实现这个代码: -

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

答案 5 :(得分:1)

夫特

以下是@user944351's answer的Swift版本:

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太大了,但您可以根据需要进行调整。

更多信息

  • 请参阅my fuller answer,其中包含使用数据库的限制和偏移重新加载数据的方法示例。

答案 6 :(得分:0)

我不确定你为什么要这样做,但我想你可以在你的cellForRowAtIndexPath方法中添加一些代码,这样如果indexPath.row ==最后一行,调用方法来添加更多行...