我有一个显示API结果的UITableView.只要用户通过searchBar:textDidChange:键入UISearchBar,就会调用API.有效实施自动完成搜索.我的问题是加载到UITableView中的结果似乎是最后一次API调用背后的迭代.
例:
用户在UISearchBar中键入“union”,但UITableView中没有显示任何结果.用户在“联合”,“联合”之后键入任何字符,并且“联合”的API结果显示在UITableView中.当用户向下滚动结果(“联合”,但实际上是“联合”)时,“重新填充的单元格”显示“联合”结果.
SearchViewController.h
#import <UIKit/UIKit.h> @interface SearchViewController : UIViewController <UITextFieldDelegate,UISearchBarDelegate,UITableViewDelegate,UITableViewDataSource,UISearchDisplayDelegate>{ UITableView *searchTableView; UISearchBar *sBar; UISearchDisplayController *searchDisplayController; } @property (strong,nonatomic) NSArray *loadedSearches; @end
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,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,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
如果我的问题不明确,请告诉我.
随意批评代码的其他方面,但我真的很感激我的问题的解决方案:)在此先感谢.
示例API响应 – http://pastebin.com/UZ1H2Zwy
解决方法
问题似乎是,在使用AFJSONRequestOperation进行异步操作时,在获取数据之前刷新表.所以你的模型可能正在更新,但你的tableview是一个刷新背后.尝试在块成功回调中移动[searchTableView reloadData]:
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request,id JSON) { self.loadedSearches = JSON[@"response"][@"venues"]; // refreshing the TableView when the block gets the response [searchTableView reloadData]; } failure:^(NSURLRequest *request,id JSON) { NSLog(@"%@",error.localizedDescription); }];
希望这有效.