Ios 在滚动UITableView时调用web服务 完全糊涂了!!!。。。
我有一个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
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行。谢谢。。我正在考虑你的解决办法。