iOS TableView实现分页功能

7

我需要在 iOS 的 tableview 中实现类似 Google 的水平翻页效果。有没有办法使用单个 tableview 实现这个功能?您能提供一种方法来实现吗?


使用 UICollectionView - nhgrif
你需要垂直滚动时的分页吗? - Charan Giri
@CharanGiri 我只需要水平滚动,这样每次滚动时就会重新加载来自后端的不同数据。 - abhhab
你应该在问题中添加更多细节,你想要什么并不清楚。 - jbouaziz
1
@jbouaziz 最初,tableview 上有 10 条记录。然而,后台有 100 条记录。我们可以在这个 tableview 上进行垂直分页,但是是否有一种方法可以通过滑动来显示相同的 tableview 中的新数据呢? - abhhab
@jbouaziz:小问题,但编辑审查不是由原始发布者完成的,而是由经验丰富的审查者完成的。当我们接受更改时,我们无法知道这是否是原始发布者的意思。 - Deanna
4个回答

11

我建议您使用 UICollectionView 而不是 UITableView。话虽如此,为了从您的服务器加载分页数据,您需要添加几行代码: 您需要在视图控制器中添加变量以跟踪您的数据:

/**
 *  Set this flag when loading data.
 */
@property (nonatomic, assign) BOOL isLoading;


/**
 *  Set this flag if more data can be loaded.
 */
@property (assign, nonatomic) BOOL hasNextPage;


/**
 *  The current page loaded from the server. Used for pagination.
 */
@property (assign, nonatomic) int currentPage;

根据你使用的实现方式,有不同的方法来检查是否是合适的时间来加载数据。

UITableView

在你的 UITableViewDelegate 实现中添加以下内容:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    // Check scrolled percentage
    //
    CGFloat yOffset = tableView.contentOffset.y;
    CGFloat height = tableView.contentSize.height - tableView.height;
    CGFloat scrolledPercentage = yOffset / height;


    // Check if all the conditions are met to allow loading the next page
    //
    if (scrolledPercentage > .6f && !self.isLoading && self.hasNextPage)
        [self loadNextPage:++self.currentPage];
}

UICollectionView

在你的 UICollectionViewDelegate 实现中添加:

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {

    // Check scrolled percentage
    //
    CGFloat yOffset = collectionView.contentOffset.y;
    CGFloat height = collectionView.contentSize.height - collectionView.height;
    CGFloat scrolledPercentage = yOffset / height;


    // Check if all the conditions are met to allow loading the next page
    //
    if (scrolledPercentage > .6f && !self.isLoading && self.hasNextPage)
        [self loadNextPage:++self.currentPage];

}


然后加载下一页:

- (void)loadNextPage:(int)pageNumber {
    if (self.isLoading) return;
    self.isLoading = YES;

    // Fetch your data here
    // ..

    // Once the request is finished, call this
    self.isLoading = NO;
}

我建议您检查滚动方向,并将其作为加载下一页的条件之一。这个答案解释了如何执行该操作。


4

UITableViewUIScrollView 的子类。在 UITableView 的代理方法中进行以下操作:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;
    CGSize size = aScrollView.contentSize;
    UIEdgeInsets inset = aScrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;
    float reload_distance = 10;
    if(y > h + reload_distance) {
        NSLog(@"load more rows");
    }
}

如果您从Web服务获取数据并且该服务支持分页,则可以实现此操作。如果if(y > h + reload_distance)为真,则调用Web服务以加载更多数据,然后重新加载表视图即可。希望这有所帮助.. :)

1
你的需求有两个选项: 1. 在ScrollView中使用分页并创建UI设计。 2. 使用转换即水平TableView。
如果你确定需要在分页上创建多个视图,那么ScrollView的内存占用率会比TableView高。如果使用TableView,则编码和内存处理都会更容易。
以下是转换TableView的代码。
UITableView* menuTableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 60, 320, 404) style:UITableViewStylePlain];
menuTableView.delegate=self;
menuTableView.dataSource=self;
CGAffineTransform transform = CGAffineTransformMakeRotation(-1.5707963);
menuTableView.transform = transform;
// Repositions and resizes the view.
CGRect contentRect = CGRectMake(0, 90, 320, 300);
menuTableView.frame = contentRect;
menuTableView.pagingEnabled= YES;
menuTableView.separatorColor=[UIColor grayColor];
[self.view addSubview:menuTableView];

希望这能对你有所帮助.. 如果你需要任何额外的信息,请让我知道


我认为他的意思是从服务器分页获取数据,而不是滚动视图。 - jbouaziz

0
你从哪里获取数据?如果你有一个API层,你可以在API方法中构建数据分页。以减少实际传递的数据量。
你可以通过单个tableView来实现这一点。你需要定义你的章节数量和每个章节的项目数量。

我正在使用SMP 2.3从MBO获取数据。传入的数据包含100条记录,我需要每次显示20条记录。 - abhhab
我是iOS的新手。我们能否使用多个section来实现水平滚动? - abhhab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接