Objective c 滚动到底部时向UITableView添加行

Objective c 滚动到底部时向UITableView添加行,objective-c,cocoa-touch,ios,uitableview,Objective C,Cocoa Touch,Ios,Uitableview,当用户滚动到UITableView的底部时,是否有方法触发事件,例如使用iAction?如果发生这种情况,我想添加更多行。我该怎么做?我不知道您为什么要这样做,但我想您可以向cellForRowAtIndexPath方法中添加一些代码,这样,如果indexPath.row==最后一行,调用该方法来添加更多行…只需听一下scrollViewDidScroll:委托方法,将内容偏移量与当前可能的偏移量进行比较,如果低于某个阈值,则调用您的方法来更新tableview。不要忘记调用[tableView

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

我不知道您为什么要这样做,但我想您可以向
cellForRowAtIndexPath
方法中添加一些代码,这样,如果indexPath.row==最后一行,调用该方法来添加更多行…

只需听一下
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];
     }
}
-(无效)scrollViewDidScroll:(UIScrollView*)滚动{
//UITableView仅沿y轴的一个方向移动
CGFloat currentOffset=scroll.contentOffset.y;
CGFloat maximumOffset=scroll.contentSize.height-scroll.frame.size.height;
//更改10.0以调整与底部的距离

如果(maximumOffset-currentOffset,除非有点晚,但我认为我找到了更好的解决方案:

而不是

 - (void)scrollViewDidScroll: (UIScrollView)scroll
我曾经

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
这更方便,因为事件只触发一次。 我在应用程序中使用了这段代码,以便在底部的tableview中加载更多的行(也许您可以从facebook应用程序中识别这种类型的重新加载-唯一的区别是它们在顶部更新)

-(void)ScrollViewDiEndDraging:(UIScrollView*)scrollView将减速:(BOOL)减速{
NSInteger currentOffset=scrollView.contentOffset.y;
NSInteger maximumOffset=scrollView.contentSize.height-scrollView.frame.size.height;
如果(maximumOffset-currentOffset
NSInteger currentOffset=scrollView.contentOffset.y;
NSInteger maximumOffset=scrollView.contentSize.height-scrollView.frame.size.height;
//触底?

如果((currentOffset>0)&(maximumOffset-currentOffset)可以用更简单的方法实现,那么您只需要确定滚动方向,就像用户向下滚动时的情况一样

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

CGPoint pointNow;
在.m文件中,在scrollViewDidScroll方法中,我们需要实现以下代码:-

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

我使用这个代码段。在
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]

获取数据源后,控制器将通知tableView委托,这将重新加载数据。

Swift 以下是Swift版本的:

func-scrollViewDiEndDraging(scrollView:UIScrollView,willDecreate-Decreate:Bool){
让currentOffset=scrollView.contentOffset.y
设maximumOffset=scrollView.contentSize.height-scrollView.frame.size.height

如果maximumOffset-currentOffset是因为我想调用REST web服务来添加更多的行,因为用户可以看到更多的条目,而不是“加载更多帖子”诸如此类,为什么不自动执行此操作呢?发布前请搜索的可能副本。在标题上搜索会发现我链接的这个问题,它的信息与Henri给你的答案相同。下面是使用Swift的infinite UITableView的演示:它使用异步任务加载数据,并显示加载页脚。没有用于快速显示内容的项目。我假定您的viewController是tableView的代理。如果是这样,只需将scrollViewDidScroll:添加到viewController,并将其用作触发更新方法的位置。比较contentOffset.y和maximum(contenSize.y-tableView.frame.size.height)应该很简单。关键是要认识到UITableView是UIScrollView的一个子类,它也传递委托方法。滚动停止后会触发它,还是在滚动时也会执行?我相信每次contentOffset更改时都会触发它,这意味着如果滚动,它将我经常被触发。这提醒了我,如果你正在做一个来自web的请求,你可能应该暂时禁用这个系统,当请求正在进行,并且一旦添加了内容就可以重新启动。只需添加一个布尔值并检查它以及偏移量差异。为什么它也会触发这个方法[self methodthattaddsdataandloadstableview];这就是我只需要对我的服务器进行一次调用所需的内容。
-(void)scrollViewDidScroll:
被触发多次以调用您的服务器。除非您按照@Henri Normak在其评论中的建议进行操作并添加更新检查。这要简单得多。感谢@user944351I对此进行了测试,但只有在表视图已接近底部时开始拖动时,它才起作用。如果是长滚动,则t如果条件不满足,即使它恰好在底部结束,他也会选择。这是有意义的,因为该方法称为“结束拖动”因此,我认为当用户结束拖动手势时,会使用偏移量调用。但是列表可以继续滚动。当列表到达底部时,它应该会自动加载,因此看起来
scrollViewDidScroll
是正确的。swift 3中的相同代码让currentOffset:Int=Int(scrollView.contentOffset.y)让maximumOffset=Int(scrollView.contentSize.height-scrollView.frame.size.height)如果maximumOffset-currentOffset回答得很好,则更倾向于使用这个与scrollViewDidScroll相比的选项-感谢vikingosegundo!如果使用加载单元格或错误单元格,请确保进行一个小检查,如:if(indexath.row>5)或者简单地将布尔值nomoredataavailable设置为false。如果您想在用户到达最后一个单元格之前稍微加载数据,这不是很好。我发现加载几次后,数据“流动”会更好
[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];
        }
    }
}
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")
    }
}