UITableView在底部加载更多单元格,多次调用方法

时间:2013-04-12 09:37:11

标签: ios objective-c uitableview uiscrollview

我正在开发一个简单的iPhone应用程序,它从UITableView中的Web服务(RSS提要)加载数据。第一次加载应用时,我使用初始值为1的计数器来加载Feed的第一页:

- (void)viewDidLoad
{
    [super viewDidLoad];
    counter = 1;    
    [self fetchEntriesNew:counter];
} 

当用户向下滚动到tableview的底部时,我使用以下方法通过递增计数器来获取rss feed的下一页来在tableview中加载更多数据:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {       
        NSLog(@"Scroll End Called");
        counter++;
        [self fetchEntries:counter];
    }
}

每次用户向下滚动到tableview的底部时,计数器都会递增,因此调用rss feed的下一页。到目前为止,一切正常。

但是,如果用户在到达底部后多次向上滚动,则计数器也会多次递增,因此会到达不同的RSS页面并添加到tableview的底部。

更准确地说,如果用户已经到达底部并向上滚动3次,而不是加载第二页,则会加载第四页(滚动3次加上已经添加的1次)

如果未加载其他页面条目,我如何限制不添加其他页面条目?

请不要建议在tableview底部或任何第三方库(如NMPaginator和PartialTable等)处理更多行的替代策略。提前感谢!

更新

我通过一次又一次地运行它来密切观察应用程序。看起来如果用户在tableview完成加载已经请求的页面数据(包括图像)之前滚动到底部(增加计数器),它将忽略加载当前正在加载的那个并开始加载下一个基于增量计数器。

2 个答案:

答案 0 :(得分:1)

您可以通过记录您需要加载的页面以及最后加载的页面来解决问题。通常,您只需要确保忽略所有最终要求您加载任何高于最后一页加载的页面的请求。 E.g:

if (pageThatNeedsToBeLoaded != lastPageLoaded + 1) {
    // ignore the request
}

此外,您可以创建一个标志来保持控制器的状态和获取状态,例如isFetchingData,当您发送请求时将设置为YES,然后将其设置为{加载数据后{1}}如果该标记设置为NO,则您不会调用任何其他请求以获取更多数据。这是假设您的数据是以递增方式加载的,并且在任何情况下您都不会同时加载多个页面。

答案 1 :(得分:1)

请您查看以下代码并告诉我们:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {   
        static int counterCheck = 0;
        ++counter;

        if (counter - counterCheck == 1)
        {
            [self fetchEntries:counter];
            ++counterCheck;
        }
        else
            --counter;
    }
}