使用 scrollViewDidScroll 方法在 UITableView 中实现分页?
Posted
技术标签:
【中文标题】使用 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];
【讨论】:
以上是关于使用 scrollViewDidScroll 方法在 UITableView 中实现分页?的主要内容,如果未能解决你的问题,请参考以下文章
UIPageViewController 委托方法类似于 scrollViewDidScroll:(UIScrollview*)scrollview
是否有像 scrollviewDidScroll 这样的 uipickerview 委托方法?
视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?
UiScrollview scrollviewDidScroll 检测用户触摸
如何从 UICollectionViewController 中的 scrollViewDidScroll 方法访问单元格成员(用于动画)?