如何在搜索结果中添加分页到Tableview?

时间:2014-05-27 05:53:25

标签: objective-c uitableview pagination

以下所示的代码行是我当前的tableview设置。我想要实现的是下图所示。

1)如果count为4,则当用户向下滚动时显示活动指示器并使用下面JSON上显示的下一个值发出请求。

2)重新加载表

3)如果count为空,则显示不再有结果。

注意:我是Objective-C的新手,所以我将非常感谢您对此主题的指导,因为我所做的所有搜索都没有成功实现我想要实现的目标,因为它们都基于已经加载的表而不是基于搜索结果。

如下图所示,是我想要实现的参考。

enter image description here

搜索JSON响应

{
    "count": 4, 
    "next": "http://api.domain.com/user-search/?page=2&subject=culture", 
    "previous": null, 
    "results": [
        {
            "name": "Guillermo Davila", 
            "nick": "guillermo", 
            "avatar_s": "https://pbs.twimg.com/profile_images/2213685686/image.jpg", 
            "user_rate": "$10/h", 
            "id": 3, 
            "subjects": "Culture and 1 other subject", 
            "bio": "I'm a nice person"
        },

        {
            "name": "Frank Smith", 
            "nick": "fsmith", 
            "avatar_s": "https://pbs.twimg.com/profile_images/2444486/image.jpg", 
            "user_rate": "$14/h", 
            "id": 3, 
            "subjects": "Culture and 1 other subject", 
            "bio": "I'm a nice person 2"
        }
    ]
}

这是我的UserTableviewController.h

    //
    //  UserTableViewController.m
    //  mobile-app
    //
    //  Created by eddwinpaz on 5/18/14.
    //  Copyright (c) 2014 eddwinpaz. All rights reserved.
    //


    #import "UserTableViewController.h"
    #import "CustomTableCell.h"
    #import "UserDetailViewController.h"
    #import "AFNetworking.h"
    #import "MBProgressHUD.h"
    #import "SimpleAudioPlayer.h"




    @interface UserTableViewController ()

    @end

    @implementation UserTableViewController
    {

        // JSON Request
        NSMutableArray *myObject;
        // A Dictionary Object
        NSDictionary *dictionary;

        NSString *name;
        NSString *subject;
        NSString *avatar;
        NSString *rate;
        NSString *bio;
        NSString *nick;

    }

    - (id)initWithStyle:(UITableViewStyle)style
    {
        self = [super initWithStyle:style];
        if (self) {
            // Custom initialization
        }
        return self;
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];
       //[self fetch_tutors]; // Get tutors Ordered By Karma DESC



        // Uncomment the following line to preserve selection between presentations.
        // self.clearsSelectionOnViewWillAppear = NO;

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    }




    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    #pragma mark - Table view data source
    /*
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        // Return the number of sections.
        return 0;
    } */

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

        // Return the number of rows in the section.

        return myObject.count; // This is old 100% working code
    }


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"CustomTableCell";
        CustomTableCell *cell = (CustomTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {

            cell = [[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        }


        dictionary = [myObject objectAtIndex:indexPath.row];

        cell.labelName.text = [dictionary objectForKey:@"name"];

        cell.labelBio.text = [dictionary objectForKey:@"bio"];

        cell.labelSubjects.text = [dictionary objectForKey:@"subject"];

        cell.imageAvatar.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dictionary objectForKey:@"avatar"]]]];
        cell.imageAvatar.clipsToBounds = YES;
        cell.imageAvatar.layer.cornerRadius = cell.imageAvatar.frame.size.width / 2;


        cell.labelRate.text = [dictionary objectForKey:@"rate"];
        cell.labelRate.layer.cornerRadius = 5;

        [SimpleAudioPlayer playFile:@"upvote.wav"];


        return cell;


    }


    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {

        if ([segue.identifier isEqualToString:@"showUserDetail"])
        {

            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
            UserDetailViewController *destViewController = segue.destinationViewController;

            NSDictionary *dict = [myObject objectAtIndex:indexPath.row];

            destViewController.http_nick = [dict valueForKey:@"nick"];
            destViewController.labelName = [dict valueForKey:@"name"];


            NSLog(@" Username Sent--->%@", [dict valueForKey:@"nick"]);
            NSLog(@" name Sent--->%@", [dict valueForKey:@"name"]);


        }
    }




    -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
    {
        NSString *searchTerm = searchBar.text;

        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.mode = MBProgressHUDModeIndeterminate;
        hud.labelText = @"Searching Tutors";
        [hud show:YES];

        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

        NSString *url = [NSString stringWithFormat:@"http://api.domain.com/user-search/?subject=%@",searchTerm];

        [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
        {

             NSLog(@"JSON: %@", responseObject);
            [hud hide:YES];

            int count_total = [[responseObject objectForKey:@"count"] intValue];

            if (count_total == 0) {

                [myObject removeAllObjects];
                NSLog(@"Count is --->0");

            }
            else {

                myObject = [[NSMutableArray alloc] init];

                name = @"name";
                subject = @"subject";
                avatar = @"avatar";
                rate = @"rate";
                bio = @"bio";
                nick = @"nick";

                for (NSDictionary *dataDict in [responseObject objectForKey:@"results"])
                {
                    NSString *name_data = [dataDict objectForKey:@"name"];
                    NSString *subject_data = [dataDict objectForKey:@"subjects"];
                    NSString *avatar_data = [dataDict objectForKey:@"avatar_s"];
                    NSString *rate_data = [dataDict objectForKey:@"user_rate"];
                    NSString *bio_data = [dataDict objectForKey:@"bio"];
                    NSString *nick_data = [dataDict objectForKey:@"nick"];

                    NSLog(@"name: %@", name_data);
                    NSLog(@"subjects: %@",subject_data);
                    NSLog(@"avatar_s: %@", avatar_data);
                    NSLog(@"user_rate: %@",rate_data);
                    NSLog(@"bio: %@",bio_data);
                    NSLog(@"nick: %@",nick_data);

                    dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                  name_data,name,
                                  subject_data,subject,
                                  avatar_data,avatar,
                                  rate_data,rate,
                                  bio_data, bio,
                                  nick_data, nick, nil];

                    [myObject addObject:dictionary];

                }

            }

            [self.searchBar endEditing:YES];
            [self.searchBar setShowsCancelButton:NO animated:YES];
            [self.searchBar sizeToFit];
            [self.tableView reloadData];


        } failure:^(AFHTTPRequestOperation *operation, NSError *error)
        {

             NSLog(@"Error: %@", error);
            [hud hide:YES];

        }];

    }




    - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
    {

        [searchBar sizeToFit];
        [searchBar setShowsCancelButton:YES animated:YES];

        return YES;
    }

    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
    {

        [self.searchBar endEditing:YES];
        [searchBar setShowsCancelButton:NO animated:YES];
        self.searchBar.text = nil;



    }


    /*
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

        if ([segue.identifier isEqualToString:@"userDetailView"]) {
            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

            UserDetailViewController *destViewController = segue.destinationViewController;

            destViewController.labelName = [myObject objectAtIndex:indexPath.row];
        }
    } */



    /*
    // Override to support conditional editing of the table view.
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // Return NO if you do not want the specified item to be editable.
        return YES;
    }
    */

    /*
    // Override to support editing the table view.
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            // Delete the row from the data source
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        } else if (editingStyle == UITableViewCellEditingStyleInsert) {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
        }   
    }
    */

    /*
    // Override to support rearranging the table view.
    - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
    {
    }
    */

    /*
    // Override to support conditional rearranging of the table view.
    - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // Return NO if you do not want the item to be re-orderable.
        return YES;
    }
    */

    /*
    #pragma mark - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

    @end

1 个答案:

答案 0 :(得分:0)

实现它的一种方法是,

  1. 将numberOfCells作为数据数组

    返回一个
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
    return myDataArray +1 ; //myDataArray is the data and One more cell for the last cell (10 out of 46 results cell)
    }
    
  2. 在cellForRowAtIndexPath中,如果您的IndexPath.row == myDataArray.count(即最后一行)创建一个自定义单元格,如图所示,并返回自定义单元格。

  3. - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath中,如果indexPath对应于最后一个单元格,则在获取结果后启动第2页的请求,更新myDataArray并重新加载表格。