我正在尝试无限滚动到我的UITableViewController并且不确定如何使用返回的数据库结果

时间:2014-03-02 22:54:00

标签: objective-c cocoa-touch uitableview ios7 uiscrollview

目前尝试使用此插件实现无限滚动到我的应用中: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。

亲切的问候

UPDATE - 我在截面方法中的行数:

- (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 个答案:

答案 0 :(得分:0)

很乐意提供帮助,但您应该先为我们提供反馈。一些想法让你去...

一般的想法是使用PFQuery上的“skip”属性来获得下一个10.每次调用它时,你都会添加10.

因此,请按照您的方式创建查询,将其保存在属性中,但将findObjectsInBackgroundWithBlock调用移动到infiniteScrollHandler,每次调用后添加10以跳过。然后在处理结束时(现在调用表重新加载),调用[strongTableView finishInfiniteScroll]

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