ios - Objective-c:如何正确地向 UITableView 添加更多行

标签 ios objective-c uitableview

我知道有很多与此类似的问题,但我还没有找到任何解释清楚的问题。

我有一个 UITableView 从 url 获取其内容(JSON),我正在使用此方法获取 JSON 数据:

-(void)getContents
{
    NSString *contentStartString = [NSString stringWithFormat:@"%ld",(long)contentStart];
    NSString *contentCountString = [NSString stringWithFormat:@"%ld",(long)contentCount];
    NSString *contentsUrl = @"http://www.ana.fm/api/index.php?start=";
    contentsUrl = [contentsUrl stringByAppendingString:contentStartString];
    contentsUrl = [contentsUrl stringByAppendingString:@"&count="];
    contentsUrl = [contentsUrl stringByAppendingString:contentCountString];
    NSLog(@"%@",contentsUrl);
    NSURL *URL = [NSURL URLWithString:contentsUrl];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    //AFNetworking asynchronous url request
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
                                         initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@", responseObject);
        jsonContents = [responseObject objectForKey:@"contents"];
        [self.tableView reloadData];
        tableLoadMoreCapability = true;
    } failure:nil];
    [operation start];
}

这很完美,但是当我到达表格的末尾时,我可以使用这种方法检测到:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {
        if(tableLoadMoreCapability == true){
            contentStart = contentStart + 20;
            [self updateContentsTable];
        }
    }
}

如您所见,我想执行此方法 updateContentsTable(当到达表的末尾时),即:

- (void)updateContentsTable
{
    tableLoadMoreCapability = false;
    NSLog(@"load more rows");
    NSString *contentStartString = [NSString stringWithFormat:@"%ld",(long)contentStart];
    NSString *contentCountString = [NSString stringWithFormat:@"%ld",(long)contentCount];
    NSString *contentsUrl = @"http://www.ana.fm/api/index.php?start=";
    contentsUrl = [contentsUrl stringByAppendingString:contentStartString];
    contentsUrl = [contentsUrl stringByAppendingString:@"&count="];
    contentsUrl = [contentsUrl stringByAppendingString:contentCountString];
    NSLog(@"%@",contentsUrl);
    NSURL *URL = [NSURL URLWithString:contentsUrl];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    //AFNetworking asynchronous url request
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
                                         initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@", responseObject);
        jsonContents = [responseObject objectForKey:@"contents"];
        [self.tableView reloadData];
    } failure:nil];
    [operation start];
}

现在我正在使用 [self.tableView reloadData]; 所以代码可以工作并且表格重新加载了新数据,我不希望这样,我需要插入新行在旧的下面,我从其他答案中了解到我必须使用 [self.tableView insertRowsAtIndexPaths: .....] 但我不知道该怎么做。

任何人都可以阐明如何做到这一点?

提前致谢。

最佳答案

我认为您所做的工作超出了您的需要。为什么不告诉 TableView 你拥有的行数大于你第一次调用时获得的行数?然后,一旦委托(delegate)人被要求在您实际加载的单元格之外的一行中输入一个单元格(表明用户已经滚动浏览了您提供的数据),您就可以通过 JSON 获取下一批数据。通过委托(delegate)方法,您可以精确控制可见单元格中显示的数据。我会完全避免滚动的东西。

您唯一需要注意的是何时(以及如何)重新加载表:您要避免重新加载调用重新加载调用重新加载....

将表格的行想象成一个窗口,在包含所有行的(虚拟)表格上滑动。

关于ios - Objective-c:如何正确地向 UITableView 添加更多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30308445/

相关文章:

ios - 弹出 View Controller 到通用 View Controller

ios - 如何为导航栏中的后退按钮设置色调颜色

ios - 从自定义类管理 NSURLSession 的完成处理程序

iphone - 循环遍历 UITableView 的 UITableViewCells

objective-c - UITableViewCell 中的 UITextField 不会成为第一响应者

ios - 具有两个动态高度 UILabel 的自调整单元格

iOS 4.0 音量渐弱

ios - 如何在应用程序中从youtube下载视频?

iphone - 使用按钮和文本字段/ View (iPhone) 打开消息应用程序(SMS 应用程序)

iphone - 旋转图像层保持中心