I have a UITableView that displays API results. The API is called whenever the user enters into the UISearchBar through searchBar: textDidChange :. Effectively perform autocomplete searches. My problem is that the results loaded into the UITableView seem to iterate after the last API call.
Example: Custom types are "combined" in a UISearchBar, but the results are not displayed in the UITableView. The user enters any character after "union", "union", for example, and the API results from "union" are displayed in the UITableView. When the user scrolls the results (from the โunionsโ, but really โcombinesโ), the โre-filled cellsโ display the result of the โunionsโ.
SearchViewController.h
SearchViewController.m
#import "SearchViewController.h" #import "AFJSONRequestOperation.h" @interface SearchViewController () @end @implementation SearchViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Search"; } return self; } - (void)viewDidLoad { [super viewDidLoad]; searchTableView = [[UITableView alloc] initWithFrame:self.view.bounds]; searchTableView.delegate = self; searchTableView.dataSource = self; [self.view addSubview:searchTableView]; sBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 160, 44)]; sBar.placeholder = @"Bus Route to..."; sBar.delegate = self; searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:sBar contentsController:self]; searchDisplayController.delegate = self; searchDisplayController.searchResultsDataSource = searchTableView.dataSource; searchDisplayController.searchResultsDelegate = searchTableView.delegate; searchTableView.tableHeaderView = sBar; } -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { NSString *searchQuery = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?ll=40.4263,-86.9177&client_id=xxx&client_secret=yyy&v=20121223&query='%@'",searchText]; searchQuery = [searchQuery stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [[NSURL alloc] initWithString:searchQuery]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){ self.loadedSearches = JSON[@"response"][@"venues"]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){ NSLog(@"%@", error.localizedDescription); }]; [operation start]; [searchTableView reloadData]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.loadedSearches.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; if(cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; } cell.textLabel.text = self.loadedSearches[indexPath.row][@"name"]; return cell; } @end
If my problem is not clear, let me know.
Feel free to criticize other aspects of the code, however I would really appreciate a solution to my problem :) Thanks in advance.
An example API response is http://pastebin.com/UZ1H2Zwy
source share