xcode – 使用UISearchBar调用API
发布时间:2020-12-14 17:29:10 所属栏目:百科 来源:网络整理
导读:我有一个显示API结果的UITableView.只要用户通过searchBar:textDidChange:键入UISearchBar,就会调用API.有效实施自动完成搜索.我的问题是加载到UITableView中的结果似乎是最后一次API调用背后的迭代. 例: 用户在UISearchBar中键入“union”,但UITableView
我有一个显示API结果的UITableView.只要用户通过searchBar:textDidChange:键入UISearchBar,就会调用API.有效实施自动完成搜索.我的问题是加载到UITableView中的结果似乎是最后一次API调用背后的迭代.
例: 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); }]; 希望这有效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |