使用 scrollViewDidScroll 方法在 UITableView 中实现分页?

     2023-02-23     293

关键词:

【中文标题】使用 scrollViewDidScroll 方法在 UITableView 中实现分页?【英文标题】:Implementing pagination in UITableView with scrollViewDidScroll method? 【发布时间】:2014-09-17 14:59:06 【问题描述】:

我正在构建一个文章阅读应用程序。我正在使用 AFNetworking 第三方库将 JSON 数据提取到 UITableView 中。

假设 Json 链接是 www.example.com&page=1 给出 1-10 篇文章,而 www.example.com&page=2 给出 11-20 篇文章等等。

我已经实现了分页和 scrollViewDidScroll 方法意味着当用户滚动它时它会给出下十篇文章。

当应用启动和 UITableView 加载 scrollViewDidScroll 方法调用了 3 次但预期调用了一次时,我遇到了问题。

我在 scrollViewDidScroll 方法中使用增量变量进行分页,因为我说它调用了 3 次,x 值变为 3 并给出 30 篇文章。

当用户再次滚动时,它会给出接下来的 30 篇文章。我无法弄清楚为什么在启动应用程序时会调用 3 次 scrollViewDidScroll 方法。

这是我的代码:

      - (void)viewDidLoad
       
         [super viewDidLoad];
          tempJson = [[NSMutableArray alloc] init];
           [self loadNinjas];
       

        - (void)loadNinjas 

              NSString *jsonLink=[NSString stringWithFormat:@"www.example.com&page=%d",x];
              NSURL *url = [[NSURL alloc] initWithString:jsonLink];
              NSURLRequest *request = [NSURLRequest requestWithURL:url];
              AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        operation.responseSerializer = [AFJSONResponseSerializer serializer];
        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
            NSArray *jsonArray = (NSArray *)responseObject;
            for (NSDictionary *dic in jsonArray) 
            Json *json = [[Json alloc] initWithDictionary:dic];
            [tempJson addObject:json];
            
              self.jsons = [[NSArray alloc] initWithArray:tempJson];
              [self.tableView reloadData];
               failure:^(AFHTTPRequestOperation *operation, NSError *error) 
               UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:[error localizedDescription]
                                                   delegate:nil
                                          cancelButtonTitle:@"Ok"
                                          otherButtonTitles:nil];
               [alertView show];
               ];
             [operation start];
            

        - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
           
           return self.jsons.count ;

            

          - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
             
               static NSString *Cellidentifier1 = @"ysTableViewCell";

               ysTableViewCell *cell1 = [tableView 

               dequeueReusableCellWithIdentifier:Cellidentifier1 forIndexPath:indexPath];
               cell1.TitleLabel1.text = [self.jsons[indexPath.row] title];

               cell1.AuthorLabel1.text = [self.jsons[indexPath.row] author];
              [cell1.ThumbImage1 setImageWithURL:[NSURL URLWithString:

               [self.jsons[indexPath.row] a_image]]];
               return cell1;
             - (void)scrollViewDidScroll: (UIScrollView*)scroll 

                CGFloat currentOffset = scroll.contentOffset.y;
                CGFloat maximumOffset = scroll.contentSize.height -       scroll.frame.size.height;

                self.tableView.contentInset = UIEdgeInsetsMake(65, 0, 0, 0);
                if (maximumOffset - currentOffset <= -60.0) 
                 x++;

                [self loadNinjas];
                [self.tableView addInfiniteScrollingWithActionHandler:^
                 ];
              [self.tableView reloadData];
             
          

【问题讨论】:

【参考方案1】:

这是一个简单的代码,它用 50 个单元格初始化 tableView,当用户向下滚动页面时,每次到达表格末尾 10 个单元格的单元格时,都会向 tableView 添加 20 个新单元格。

int i;
int lastSeen;

- (void)viewDidLoad 
    [super viewDidLoad];

    i = 50;
    lastSeen = 0;


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    // Return the number of sections.
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    // Return the number of rows in the section.
    return i;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell" forIndexPath:indexPath];

    cell.textLabel.text = [NSString stringWithFormat:@"%ld", (long)indexPath.row];

    lastSeen = (lastSeen < indexPath.row) ? indexPath.row : lastSeen;

    return cell;

- (void)scrollViewDidScroll: (UIScrollView*)scroll 
    if (lastSeen >= (i - 10)) 
        i += 20;

        //load new data here.

        [self.tableView reloadData];

    

【讨论】:

UIPageViewController 委托方法类似于 scrollViewDidScroll:(UIScrollview*)scrollview

】UIPageViewController委托方法类似于scrollViewDidScroll:(UIScrollview*)scrollview【英文标题】:UIPageViewControllerdelegatemethodsimilartoscrollViewDidScroll:(UIScrollview*)scrollview【发布时间】:2014-09-2221:01:22【问题描述】:我正在使用UIPageViewContr 查看详情

视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?

】视差UIScrollView–在一个scrollViewDidScroll方法中处理两个视图?【英文标题】:ParallaxUIScrollView–handlingtwoviewsinonescrollViewDidScrollmethod?【发布时间】:2014-02-1313:52:20【问题描述】:我正在使用两个UIScrollView实例(cardScrollView和tileScro... 查看详情

是否有像 scrollviewDidScroll 这样的 uipickerview 委托方法?

】是否有像scrollviewDidScroll这样的uipickerview委托方法?【英文标题】:isthereauipickerviewdelegatemethodlikescrollviewDidScroll?【发布时间】:2011-10-0209:40:46【问题描述】:我有一个自定义的UIPickerview,我不想使用日期选择器。我想实现当用... 查看详情

UiScrollview scrollviewDidScroll 检测用户触摸

】UiScrollviewscrollviewDidScroll检测用户触摸【英文标题】:UiScrollviewscrollviewDidScrolldetectusertouch【发布时间】:2014-07-0509:31:50【问题描述】:我在我的应用程序中使用UIScrollView,并使用scrollviewDidScroll方法来移动不在滚动视图内的其他... 查看详情

如何从 UICollectionViewController 中的 scrollViewDidScroll 方法访问单元格成员(用于动画)?

】如何从UICollectionViewController中的scrollViewDidScroll方法访问单元格成员(用于动画)?【英文标题】:Howtoaccesscellmembers(foranimation)fromscrollViewDidScrollmethodinUICollectionViewController?【发布时间】:2019-10-0809:46:53【问题描述】:如何通过UI... 查看详情

覆盖scrollViewDidScroll时的问题,但不是UIScrollViewDelegate的所有其他方法

】覆盖scrollViewDidScroll时的问题,但不是UIScrollViewDelegate的所有其他方法【英文标题】:ProblemswhenoverridingscrollViewDidScroll,butnotalltheothermethodsofUIScrollViewDelegate【发布时间】:2012-04-0815:18:12【问题描述】:好的,所以我针对这个问题... 查看详情

UIScrollViewDelegate scrollViewDidScroll 方法跟不上高速滚动(轻弹)?

】UIScrollViewDelegatescrollViewDidScroll方法跟不上高速滚动(轻弹)?【英文标题】:UIScrollViewDelegatescrollViewDidScrollmethodnotkeepingupwithhigh-velocityscrolling(flick)?【发布时间】:2017-09-2816:53:32【问题描述】:我有一个UIScrollView和一个UIView标... 查看详情

我能以某种方式从 UIPageViewController 获取 scrollViewDidScroll: UIScrollView Delegate 方法吗?

】我能以某种方式从UIPageViewController获取scrollViewDidScroll:UIScrollViewDelegate方法吗?【英文标题】:CanIsomehowgetthescrollViewDidScroll:UIScrollViewDelegatemethodfromUIPageViewController?【发布时间】:2014-03-2622:59:33【问题描述】:我有一个UIViewControll 查看详情

使用 scrollViewDidScroll 处理多个 Collection View Cells

】使用scrollViewDidScroll处理多个CollectionViewCells【英文标题】:UsingscrollViewDidScrolltohandlemultipleCollectionViewCells【发布时间】:2021-03-1523:05:43【问题描述】:我目前正在使用scrollViewDidScroll为我的UICollectionView单元格的偏移设置动画。集... 查看详情

在 UIWebView 中没有调用 scrollViewDidScroll

】在UIWebView中没有调用scrollViewDidScroll【英文标题】:scrollViewDidScrollnotgettingcalledinUIWebView【发布时间】:2017-02-2407:00:43【问题描述】:当我在webView中加载html字符串但内容正在滚动并且scrollViewDidScroll没有被调用时,我试图在scrollV... 查看详情

如何在 scrollViewDidScroll 回调中使用滚动到单元格?

】如何在scrollViewDidScroll回调中使用滚动到单元格?【英文标题】:HowtousescrolledtocellsinscrollViewDidScrollcallback?【发布时间】:2018-09-0422:10:20【问题描述】:我有以下功能,当显示单元格时,它会自动将我的时间轴滚动到最后一个可... 查看详情

如何附加滚动视图委托方法?

...滚动视图的集合视图。滚动视图具有自定义类,该类具有scrollViewDidScroll功能。每当我滚动时,scrollViewDidScroll方法都不会触发。我尝试将它的委托附加到它自己的类以及所有其他类和视图控制器本身。我使用cellF 查看详情

未调用 scrollViewDidScroll -- 调用了 scrollViewDidEndDecelerating

】未调用scrollViewDidScroll--调用了scrollViewDidEndDecelerating【英文标题】:scrollViewDidScrollnotcalled--scrollViewDidEndDeceleratingiscalled【发布时间】:2014-11-1802:02:35【问题描述】:我有一个自定义视图替换了键盘,我试图让它在用户向下滚动... 查看详情

我的应用调用 scrollViewDidScroll 19 次

】我的应用调用scrollViewDidScroll19次【英文标题】:MyAppcallsscrollViewDidScroll19times【发布时间】:2010-10-0411:20:46【问题描述】:我有一个基于Apple的PageControl示例的应用程序。第一次加载视图时,滚动视图会加载第0页和第1页。每当启... 查看详情

在滚动之前启动时调用 scrollViewDidScroll

】在滚动之前启动时调用scrollViewDidScroll【英文标题】:scrollViewDidScrollcalledwhenlaunchedbeforescrolling【发布时间】:2018-07-2311:28:47【问题描述】:我正在使用https://github.com/xmartlabs/XLPagerTabStrip它有containerview,这是一个scrollview,孩子vie... 查看详情

ObjC 未正确转发 scrollViewDidScroll 消息

】ObjC未正确转发scrollViewDidScroll消息【英文标题】:ObjCdoesn\'tforwardscrollViewDidScrollmessagecorrectlly【发布时间】:2015-12-1015:20:24【问题描述】:我想为UIScrollViewDelegate使用多播委托技术。我的总体想法与此类似:https://github.com/tkach/Mul... 查看详情

更改 UIScrollVIew Content Inset 触发 scrollViewDidScroll

】更改UIScrollVIewContentInset触发scrollViewDidScroll【英文标题】:ChangingUIScrollVIewContentInsettriggersscrollViewDidScroll【发布时间】:2015-03-3108:45:03【问题描述】:我使用以下代码为我的tableView设置contentInset。self.scrollView.contentInset=UIEdgeInset 查看详情

使用 swift 将 y contentOffset 从 scrollViewDidScroll(scrollView 传递到另一个视图控制器

】使用swift将ycontentOffset从scrollViewDidScroll(scrollView传递到另一个视图控制器【英文标题】:PassingycontentOffsetfromscrollViewDidScroll(scrollViewtoanotherviewcontrollerusingswift【发布时间】:2014-06-1216:36:52【问题描述】:我不熟悉编程和swift。我... 查看详情