1. 程式人生 > >UISearchController進行網路實時搜尋

UISearchController進行網路實時搜尋

首先設定一個搜尋button用以觸發搜尋

self.navigationItem.rightBarButtonItem = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearchtarget:selfaction:@selector(searchBarButtonItemAction:)];


接下來到方法中進行

- (void)searchBarButtonItemAction:(UIButton *)sender {

self.tableViewVC = [[UITableViewController

alloc] initWithStyle:UITableViewStylePlain];

    self.tableViewVC.tableView.frame = CGRectMake(0, 0, kWidth, kHeight - 49 - 64);

_tableViewVC.tableView.tableFooterView =[[UIViewalloc] initWithFrame:CGRectZero];

_tableViewVC.tableView.delegate = self;

_tableViewVC.tableView.dataSource = self;

_tableViewVC

.tableView.rowHeight = 60;

    [_tableViewVC.tableViewregisterClass:[SearchCellclass] forCellReuseIdentifier:@"search"];

self.searchVC = [[UISearchControlleralloc] initWithSearchResultsController:self.tableViewVC];

    self.searchVC.delegate = self;

_searchVC.searchResultsUpdater = self;

    [_searchVC

setHidesNavigationBarDuringPresentation:NO];

_searchVC.searchBar.placeholder = @"搜尋新聞/使用者/公司";

self.tabBarController.tabBar.hidden = YES;

    [selfpresentViewController:self.searchVCanimated:YEScompletion:nil];

}



UISearchController的建立需要指定一個展示搜尋結果的控制器, 如果填nil預設為當前控制器. 在實際應用中, 當前控制器並不適合展示結果, 所以新建了一個tableview展示結果. 
如果當前控制器的導航欄是不透明的, 需要設定
[_searchVC setHidesNavigationBarDuringPresentation:NO]; 
否則searchBar會顯示不完全. 如果當前控制器的導航欄是透明的, searchBar會正常顯示, 但是會導致滾動試圖有時莫名其妙縮排, 我還沒搞明白, 下望大家交流下.

點選搜尋後, 會彈出seachBar, 在searchBar輸入要搜尋的關鍵字, 這時下面這個方法就會執行, 當然要先指定

_searchVC.searchResultsUpdater =self;

我以向伺服器介面傳送post請求為例. 你每輸入一個字或一個字母他就會執行一次下面的方法, 所以搜尋資料就會實時展示

#pragma mark - UISearchResultsUpdating

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController

{

    self.searchKey = searchController.searchBar.text;

NSMutableURLRequest *requirest = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:@"https://介面網址"]];

    NSString *value =[NSString stringWithFormat:@"word=%@", self.searchKey];

    requirest.HTTPBody = [value dataUsingEncoding:NSUTF8StringEncoding];

    requirest.HTTPMethod = @"POST";

    [NSURLConnection sendAsynchronousRequest:requirest queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableLeaveserror:nil];

        self.result = [[Result alloc] initWithDictionary:dic[@"data"]];

        [self.tableViewVC.tableView reloadData];

    }];

}