我有一个UIScrollView
内有一个UITableView
。我已禁用UITableView
的滚动所以我只想检查我的滚动视图是否已到达底部,如果这样调用加载更多的表函数。所以我为此做了类似的事。
func scrollViewDidScroll(scrollView: UIScrollView) {
if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
//reach bottom
self.startRec+=10
self.jsonParser()
}
else if (scrollView.contentOffset.y < 0){
//reach top
}
else if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){
//not top and not bottom
}
}
但我的问题是,当我滚动它时,似乎多次调用此jsonParser()
。我怎么解决这个问题?请帮我。
感谢
答案 0 :(得分:0)
您可以向类中添加一个实例变量,以跟踪jsonParser的运行时间。如果它已经运行,那么返回时不做任何事情。只有当jsonParser还没有运行时,你才需要增加startRec。类似的东西:
encode
答案 1 :(得分:0)
您是否有理由在滚动视图中子视图表视图?我的意思是表视图是scrollview的子类,使用tableView的主要优点之一是dequeueCell方法。
只需将tableview放在视图控制器中的所需位置,然后使用委托函数
,就可以从应用程序中获得更好的性能。func tableView(_:willDisplayCell:forRowAtIndexPath:)
在这个委托方法中你可以调用你的jsonParser,如果进入视图的单元格是,数据源末尾有3-5个索引
func tableView(_:willDisplayCell:forRowAtTndexPath:) {
if (indexPath.row == resultsArray.count - 3) {
//load your extra data
self.startRec+=10
self.jsonParser()
}
当然,您可以将数字3更改为您想要的任何内容,但这会产生这样一种情况,即只要表格接近数据源的末尾,您的jsonParser()就会被调用,并且您将获得使用出队单元的好处。
以下是Apple博客文档的链接,如果您想要参考:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath:
我使用相同的方法处理我为无限滚动创建的集合视图。
-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.item == self.arrCollectionData.count - 5) {
[self.myWebService startWebServiceRequestWithURL:_currentURL];
}
}
答案 2 :(得分:0)
当用户启动,拖动,然后从他们的设备抬起手指时,会多次调用UIScrollViewDelegate
个方法。您应该检查现有的解析器,如果有一个只是返回而不是运行新的解析器。
jsonParser()
内部:
func jsonParser() {
if /* JSON is in process */ {
return
}
// process then clean up
}
这会阻止您的代码多次触发。只需确保正确管理您的州。