Ios 在滚动UITableView时调用web服务 完全糊涂了!!!。。。

Ios 在滚动UITableView时调用web服务 完全糊涂了!!!。。。,ios,iphone,objective-c,web-services,uitableview,Ios,Iphone,Objective C,Web Services,Uitableview,我有一个web服务,它接受pageNumber作为参数,并将一些记录作为JSON响应提供给我。(该服务基本上实现了Silverlight版本的分页功能。我想在用户滚动UITableView时逐个加载这些页面(意味着在用户滚动时加载接下来的20个条目(或第二页)) 我的问题: int lastPageNumber; - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGPoint offset = scrollView.co

我有一个web服务,它接受
pageNumber
作为参数,并将一些记录作为JSON响应提供给我。(该服务基本上实现了Silverlight版本的分页功能。
我想在用户滚动
UITableView
时逐个加载这些页面(意味着在用户滚动时加载接下来的20个条目(或第二页))

我的问题:

int lastPageNumber;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint offset = scrollView.contentOffset;
    CGRect bounds = scrollView.bounds;
    CGSize size = scrollView.contentSize;
    UIEdgeInsets inset = scrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;

    float reload_distance = 10;
    if(y > h + reload_distance)
    {
        lastPageNumber++;
        [[NSUserDefaults standardUserDefaults] setInteger:lastPageNumber forKey:@"PageNumber"];        
        // Call the method.
    }
}
如何以及在何处调用此服务以及如何计算页码

我对此进行了搜索,但没有得到满意的答案

我发现的是:

int lastPageNumber;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint offset = scrollView.contentOffset;
    CGRect bounds = scrollView.bounds;
    CGSize size = scrollView.contentSize;
    UIEdgeInsets inset = scrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;

    float reload_distance = 10;
    if(y > h + reload_distance)
    {
        lastPageNumber++;
        [[NSUserDefaults standardUserDefaults] setInteger:lastPageNumber forKey:@"PageNumber"];        
        // Call the method.
    }
}
  • 我很乐意用Objective-C语言回答您的问题


    有什么建议吗?

    要创建一个无限滚动条,您需要知道何时开始获取新项目。有很多方法可以做到这一点,但最好的方法是挂接UITableViewDelegate的方法。调用cellForRowAtIndexPath:时,检查该行是否是数据存储中的最后一行。如果是,则调用新数据,然后将其附加到旧数据并刷新视图。您还可以连接到“表格视图”滚动条,查看它何时将X百分比滚动到底部以进行此调用。

    In.h:

    int lastPageNumber;
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGPoint offset = scrollView.contentOffset;
        CGRect bounds = scrollView.bounds;
        CGSize size = scrollView.contentSize;
        UIEdgeInsets inset = scrollView.contentInset;
        float y = offset.y + bounds.size.height - inset.bottom;
        float h = size.height;
    
        float reload_distance = 10;
        if(y > h + reload_distance)
        {
            lastPageNumber++;
            [[NSUserDefaults standardUserDefaults] setInteger:lastPageNumber forKey:@"PageNumber"];        
            // Call the method.
        }
    }
    
    In.m:

    int lastPageNumber;
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGPoint offset = scrollView.contentOffset;
        CGRect bounds = scrollView.bounds;
        CGSize size = scrollView.contentSize;
        UIEdgeInsets inset = scrollView.contentInset;
        float y = offset.y + bounds.size.height - inset.bottom;
        float h = size.height;
    
        float reload_distance = 10;
        if(y > h + reload_distance)
        {
            lastPageNumber++;
            [[NSUserDefaults standardUserDefaults] setInteger:lastPageNumber forKey:@"PageNumber"];        
            // Call the method.
        }
    }
    
    cellforrowatinexpath
    delegate方法中

    int rowNum =indexPath.row;
    if(rowNum%20==0)
    {
         if(rowNum/20>lastPageNumber)
         {
            //call webService
            lastPageNumber++;
         }
    }
    

    取一个
    整数
    将其设置为0。现在使用Pull刷新功能()

    现在在API端,您必须设置两个额外的参数,如
    pagenumber
    pageSize

    在第一次调用API时,使用
    pageNumber=0
    pageSize=20


    现在,当您拉取表时,您有一个特殊的方法,在该方法中,您必须再次使用
    pageNumber++
    pageSize=20
    调用API,并且将响应中得到的任何内容添加到
    NSMutableArray
    中。如果未找到任何内容,请删除“拉入刷新”选项

    我用以下代码解决了我的问题:

    int lastPageNumber;
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGPoint offset = scrollView.contentOffset;
        CGRect bounds = scrollView.bounds;
        CGSize size = scrollView.contentSize;
        UIEdgeInsets inset = scrollView.contentInset;
        float y = offset.y + bounds.size.height - inset.bottom;
        float h = size.height;
    
        float reload_distance = 10;
        if(y > h + reload_distance)
        {
            lastPageNumber++;
            [[NSUserDefaults standardUserDefaults] setInteger:lastPageNumber forKey:@"PageNumber"];        
            // Call the method.
        }
    }
    

    希望,这将对未来的访问者有所帮助。

    我不想在数组中追加数据,因为服务器上可能有数千条记录。如果我继续追加数据,我的应用程序可能不一致。如果是这样,请不要追加,而是替换。只需跟踪当前页面。好的。。那很好。但是如果我在CellForRowatineXpath中编写调用webservice的代码,那么该代码将针对每个新单元格执行。这可能会减慢滚动效果,并导致用户界面不好。您可以在到达最后一个单元格之前调用Web服务。例如,如果您到达中间单元格,您将调用下一页。你存储你所在的页面,前一页和后一页。非常重要-您应该在另一个线程中使数据异步。我认为这样,就不应该减速。如何确保电池是最后一个?你能给我一些代码吗?如果你不想填充表视图的数组一次不能包含超过20个项目,我认为你不能平滑滚动,因为你的表视图中最多只有20行。好的。我可以用这20位数字来折衷一下。在过去的两天里,我一直在努力找出解决同一问题的办法,但幸运的是,你必须在你的数据中添加从Web服务返回的新对象。你正在使用这些对象填充TableView,但当用户向上滚动时,我必须减少lastPageNumber。。。在哪里写呢?我认为你不需要递减它,因为你的数组中已经有了以前单元格的数据…但是如果你想递减,在第二个if语句之后,放else{lastPageNumber--;},我不想在数组中追加数据。这就是我需要减量的原因。如果你不追加,我想你的应用程序会崩溃,因为你的代码可能像cell.textlab.text=[dataArr objectAtIndex:indexath.row];并且indexPatgh.row将超出您的数据ARR的范围超过20行。谢谢。。我正在考虑你的解决办法。