我正在尝试在我的 UITableViewController 中实现无限滚动,但不确定如何使用返回的数据库结果

Posted

技术标签:

【中文标题】我正在尝试在我的 UITableViewController 中实现无限滚动,但不确定如何使用返回的数据库结果【英文标题】:I'm trying to implement infinite scrolling into my UITableViewController and unsure how to use the database results returned 【发布时间】:2014-03-02 22:53:59 【问题描述】:

目前正在尝试使用此插件在我的应用中实现无限滚动:https://github.com/pronebird/UIScrollView-InfiniteScroll

到目前为止,我已将此代码添加到我的 tableview 控制器 viewDidAppear 和 viewDidDisappear 方法中:

- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    // setup infinite scroll
    // keep a weak reference to table view
    __weak UITableView *weakTableView = self.tableView;

    [self.tableView addInfiniteScrollWithHandler:^
        // keep a strong reference to table view
        __strong UITableView *strongTableView = weakTableView;

        // seems like our table view didn't make it
        if(strongTableView == nil) return;


        //
        // fetch your data here, can be async operation,
        // just make sure to call finishInfiniteScroll in the end


        // finish infinite scroll animation
        [strongTableView finishInfiniteScroll];
    ];


- (void)viewDidDisappear:(BOOL)animated 
    [super viewDidDisappear:animated];

    // remove infinite scroll
    [self.tableView removeInfiniteScroll];
    [[self tableView] reloadData];

我拖动表格,微调器显示在最后一行下方,一两秒后消失。现在我需要做的就是从我的数组中获取数据并将其添加到 viewDidAppear 代码中的块中。

这就是我目前将 parse.com 数据放入名为“people”的 NSMuteableArray 实例的方式:

- (void)populatePeopleArrayWithCloudData 
    // Grab data for datasource and store in people array
    NSLog(@"view did load");
    people = [[NSMutableArray alloc] init];


    PFQuery *query = [PFQuery queryWithClassName:@"People"];
    [query whereKey:@"active" equalTo:@1];
    [query orderByDescending:@"createdAt"];
    [query setLimit:10];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 

        if (!error) 
            for (PFObject *object in objects) 

                Person *person = [[Person alloc] init];
                [person setName:[object objectForKey:@"name"]];
                [person setNotes:[object objectForKey:@"notes"]];
                [person setAge:[[object objectForKey:@"age"] intValue]];
                [person setSince:[object objectForKey:@"since"]];
                [person setFrom:[object objectForKey:@"from"]];
                [person setReferenceNumber:[object objectForKey:@"referenceNumber"]];

                PFFile *userImageFile = object[@"image"];
                [userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) 
                    if (!error) 
                        UIImage *image = [UIImage imageWithData:imageData];
                        [person setImage:image];
                    
                ];

                [person setActive:[[object objectForKey:@"active"] intValue]];
                [person setObjectId:[object objectId]];
                [people addObject:person];
            

         else 
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        

        NSLog(@"Calling reloadData on %@ in viewDidLoad", self.tableView);
        [self.tableView reloadData];

    ];


我将结果限制为 10 个。现在我想做的是在每次滚动到表格底部时继续抓取下一个尚未抓取的 10 个结果。帮助我执行此操作的代码需要放在上面提到的块中。

我的 tableviewdatasource 方法使用了“people”实例:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [[self tableView] dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    

        // Configure the cell...

        Person *current;
        if (tableView == [[self searchDisplayController] searchResultsTableView]) 
            current = [searchResults objectAtIndex:indexPath.row];
         else 
            current = [people objectAtIndex:[indexPath row]];
        

        [[cell textLabel] setText: [current name]];
        [[cell imageView] setImage: [current image]];
        [[cell detailTextLabel] setText: [current notes]];

    return cell;

如何通过此插件使用我的数据库结果?如您所见,我将结果限制为 10,当我滚动到表格底部时,我需要抓取下一个 10,并将它们添加到表格的最后一行之后。

亲切的问候

更新 - 我在部分方法中的行数:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


    // Return the number of rows in the section.


    if (tableView == [[self searchDisplayController] searchResultsTableView]) 
        return [searchResults count];

     else 
        return [people count];
    


【问题讨论】:

【参考方案1】:

很高兴为您提供帮助,但您可能应该先试一试,以便我们提供反馈。一些想法让你开始......

大体思路是使用PFQuery上的“skip”属性来获取接下来的10个,每次调用就加10个。

因此,像您一样创建您的查询,将其保留在一个属性中,但将您的 findObjectsInBackgroundWithBlock 调用移动到您的infiniteScrollHandler,每次调用后添加 10 以跳过。然后在处理结束时(现在调用 table reload),调用 [strongTableView finishInfiniteScroll]

在您的 numberOfRows 中,您必须提供您的来源可用的最大人数。

【讨论】:

我试着思考如何把它放在一起,它让我有点头疼:)。首先,我创建了一个 PFQuery 类型的 captureQuery 实例变量。我将在块运行之前使用它来捕获查询。 我确实注意到您将有两个级别的“块年龄”(块中的块)。可能最好先使用 findObjects: 然后担心在后台进行搜索。

以上是关于我正在尝试在我的 UITableViewController 中实现无限滚动,但不确定如何使用返回的数据库结果的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试在我的设备上获得真实的广告,但应用在我的 Android 应用上显示测试广告

我正在尝试让一个 jquery 插件在我的 wordpress 网站上工作

我正在尝试在我的 UITableViewController 中实现无限滚动,但不确定如何使用返回的数据库结果

我正在尝试在我的程序中本地解码 JSON 文件,但不断收到错误

我正在尝试从我的主 ViewController 调用一个函数并使用它在我的第二个 ViewController 中加载 JSON 数据

单击时,我正在尝试在我的网站上的导航栏项目中添加一个活动类