【问题标题】:UITableView Load More Cells At Bottom, Method Getting Called Multiple TimesUITableView 在底部加载更多单元格,方法被多次调用
【发布时间】:2013-04-04 18:36:05
【问题描述】:

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

- (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 提要的下一页。至此,一切正常。

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

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

如果之前的页面条目未加载,我如何限制不添加另一个页面条目?

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

更新:

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

【问题讨论】:

  • 你可以查看这个答案stackoverflow.com/questions/15898215/…
  • 我看不出你建议的答案如何帮助解决我提出的问题
  • 能否保留已加载的计数器列表?因此,每次调用 [self fetchEntries:counter] 时,计数器对象都会添加到列表中,并且您只加载未出现在该列表中的计数器。但更简单的解决方法是在用户向上滚动时减少计数器?
  • @JDx 1) 我已将计数器用于其他目的,计数器在应用程序运行之间为我提供了很好的服务,但在这种情况下,假设用户滚动两次,它会调用第二页,然后是第三页页面,然后加载第三页。所以柜台无法解决这个问题。 2)减少计数器只会显示已经加载的内容。

标签: ios objective-c uitableview uiscrollview


【解决方案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;
    }
}

【讨论】:

  • 我已经用我的 viewdidload 中的计数器的初始值更新了这个问题。您提供的代码不起作用。它不再使用此代码加载单元格。
  • 你的答案是解决了一半的问题。现在,如果用户在加载第一页后到达底部并说向上滚动两次,它仍然会加载第三页,尽管它应该加载第二页。它的正确做法是,如果停止并再次运行应用程序,如果滚动一次,它将加载第二个,并且第三个已经缓存。
【解决方案2】:

您可以通过记录需要加载的页面以及最后加载的页面来解决问题。通常,您只需要确保忽略所有最终要求您加载比最后加载页面高 1 的页面的请求。例如:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多