我想在iOS tableview中实现分页

时间:2014-03-06 04:04:20

标签: ios uitableview pagination

我需要在iOS tableview中实现像google这样的横向分页。我们有什么方法可以使用单个tableview来做到这一点吗?你能建议一种方法吗?

4 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:3)

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服务加载更多数据,然后重新加载表视图。希望这有助于.. :))

答案 2 :(得分:1)

您有2个选项可满足您的要求 1.Scrollview与分页和创建UI设计。 2.具有转换的Tableview我的意思是水平的tableview。

如果您确定与tableview相比,scrollview内存将会很高,因为您需要在分页上创建许多视图。如果你使用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];

希望这会对您有所帮助..如果您需要任何其他信息,请告诉我

答案 3 :(得分:0)

您从哪里获取数据?如果您有API层,则可以将数据分页构建到API方法中。减少来回传递的实际数据量。

您可以使用单个tableView实现此目的。您需要定义部分数量和每个部分的项目数。