简介

UISearchController是iOS 8 之后推出的一个新的控件, 用于创建搜索条, 及管理搜索事件, 使用这个, 我们可以很容易的创建属于自己的搜索框。搜索框在app开发中是非常常见的,比如说我们要搜索一个地点。这里就利用到了这个控件,简单记录一下。

简单使用

我们就以上面这个Demo举例实现一个简单的UISearchViewController的使用。
UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作。UISearchController 把两个控制器(UIViewController)连在一起。父控制器放置 UISearchBar 控件。当用户点击搜索框时,UISearchBar 会移到屏幕顶部;输入搜索关键词,UISearchBar 下面出现子控制器的view
所以UISearchController是很少单独使用的,一般都是配合其他的控件进行使用,实现联想搜索结果的展示栏一般是使用UITableView实现的。

控件属性

// 初始化方法, 参数是展示搜索结果的控制器, 如果是在当前控制器展示搜索结果, 就传nil
- (instancetype)initWithSearchResultsController:(nullable UIViewController *)searchResultsController;// 负责更新搜索结果的代理, 需要遵循 UISearchResultsUpdating 协议
@property (nullable, nonatomic, weak) id <UISearchResultsUpdating> searchResultsUpdater;// 搜索控制器是否是活跃状态, 当在一个控制器展示搜索结果的时候, 可以此来判断返回的数据源
@property (nonatomic, assign, getter = isActive) BOOL active;
// 控制器代理  遵循 UISearchControllerDelegate协议
@property (nullable, nonatomic, weak) id <UISearchControllerDelegate> delegate;
// 当搜索框激活时, 是否添加一个透明视图
@property (nonatomic, assign) BOOL dimsBackgroundDuringPresentation __TVOS_PROHIBITED;
@property (nonatomic, assign) BOOL obscuresBackgroundDuringPresentation NS_AVAILABLE_IOS(9_1); // default is YES
// 当搜索框激活时, 是否隐藏导航条
@property (nonatomic, assign) BOOL hidesNavigationBarDuringPresentation;     // default is YES@property (nullable, nonatomic, strong, readonly) UIViewController *searchResultsController;
@property (nonatomic, strong, readonly) UISearchBar *searchBar;

这里注意: UISearchController 在使用的时候, 需要设置为全局的变量或者控制器属性, 使其生命周期与控制器相同; 如果设置为局部变量, 会提前销毁, 导致无法使用.

创建Demo的一些属性

这里的采用了高德的搜索SDK——高德开发手册

//
//  SearchViewController.h
//  ShareParking
//
//  Created by 差不多先生 on 2022/3/26.
//#import <UIKit/UIKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
#import <MAMapKit/MAMapKit.h>NS_ASSUME_NONNULL_BEGIN@interface SearchViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, AMapSearchDelegate>@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) UISearchController *searchController;
// 数据源数组
@property (nonatomic, strong) NSMutableArray *datas;
// 搜索结果数组
@property (nonatomic, strong) NSMutableArray *results;// 搜索接口
@property (nonatomic, strong) AMapSearchAPI* search;
@property (nonatomic, retain) MAUserLocation* currentLocation;
// 搜索字段
@property (nonatomic, strong) NSString* searchString;
@endNS_ASSUME_NONNULL_END

首先我们要继承UISearchResultsUpdating协议。

初始化位置

这里因为我们默认搜索类型是停车场,所以初始化数据时,会自动检索当前位置附近的停车场。
以下是使用高德获取的数据。

 (void)getParking {_searchString = @"停车场";_datas = [[NSMutableArray alloc] init];self.search = [[AMapSearchAPI alloc] init];self.search.delegate = self;AMapPOIAroundSearchRequest *request = [[AMapPOIAroundSearchRequest alloc] init];//当前位置request.location = [AMapGeoPoint locationWithLatitude:34.15408339 longitude:108.90631727];request.keywords            = _searchString;/* 按照距离排序. */request.sortrule            = 0;request.requireExtension    = YES;// 启动任务[self.search AMapPOIAroundSearch:request];
}
- (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response {int j = 0;if(response.pois.count == 0) {NSLog(@"111");return;}//通过 AMapPOISearchResponse 对象处理搜索结果[self.datas removeAllObjects];//解析response获取POI信息,具体解析见 Demofor (AMapPOI *p in response.pois) {j = 0;for (int i = 0; i < _datas.count; i++) {AMapPOI* a = _datas[i];if ([p.name isEqual:a.name]) {j = 1;}}if (j == 0) {//搜索结果存在数组[self.datas addObject:p];}}dispatch_async(dispatch_get_main_queue(), ^{// UI更新代码[self.tableView reloadData];});}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {// 这里通过searchController的active属性来区分展示数据源是哪个if (self.searchController.active) {return self.results.count ;}return self.datas.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];if (cell == nil) {cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellID"];}if ([_datas[0] class] == [AMapPOI class]) {AMapPOI *p = self.datas[indexPath.row];cell.textLabel.text = p.name;} else {AMapTip* p = self.datas[indexPath.row];cell.textLabel.text = p.name;}return cell;
}


就可以达成这样一个效果。

利用SearchBar进行搜索

这里我们需要将SearchBar加入tableView最上面的位置。

 // 创建UISearchController, 这里使用当前控制器来展示结果UISearchController *search = [[UISearchController alloc]initWithSearchResultsController:nil];// 设置结果更新代理search.searchResultsUpdater = self;[self getParking];// 因为在当前控制器展示结果, 所以不需要这个透明视图search.dimsBackgroundDuringPresentation = NO;self.searchController = search;// 将searchBar赋值给tableView的tableHeaderViewsearch.searchBar.placeholder = @"选择停车位位置";self.tableView.tableHeaderView = search.searchBar;

接下来我们需要调用协议方法:
这个方法会在我们输入时调用,我们可以在这里根据输入文字重新搜索位置,并且刷新tableView的数据。

// 输入响应函数
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {_searchString = searchController.searchBar.text;[self inputAddress];}
- (void)inputAddress {AMapInputTipsSearchRequest *tips = [[AMapInputTipsSearchRequest alloc] init];tips.keywords = _searchString;tips.city     = @"西安";tips.cityLimit = YES;[self.search AMapInputTipsSearch:tips];
}
/* 输入提示回调. */
- (void)onInputTipsSearchDone:(AMapInputTipsSearchRequest *)request response:(AMapInputTipsSearchResponse *)response {if(response.count == 0) {NSLog(@"111");return;} else {[_datas removeAllObjects];for (int i = 0; i < response.count; i++) {AMapTip* p = response.tips[i];[_datas addObject:p];}}dispatch_async(dispatch_get_main_queue(), ^{// UI更新代码[self.tableView reloadData];});
}
//@interface AMapTip : AMapSearchObject
/poi的id
//@property (nonatomic, copy) NSString *uid;
/名称
//@property (nonatomic, copy) NSString *name;
/区域编码
//@property (nonatomic, copy) NSString *adcode;
/所属区域
//@property (nonatomic, copy) NSString *district;
/地址
//@property (nonatomic, copy) NSString *address;
/位置
//@property (nonatomic, copy) AMapGeoPoint *location;
/类型码, since 4.5.0. 对应描述可下载参考官网文档 http://a.amap.com/lbs/static/zip/AMap_API_Table.zip。
//@property (nonatomic, copy) NSString *typecode;
- (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response {int j = 0;if(response.pois.count == 0) {NSLog(@"111");return;}//通过 AMapPOISearchResponse 对象处理搜索结果[self.datas removeAllObjects];//解析response获取POI信息,具体解析见 Demofor (AMapPOI *p in response.pois) {j = 0;for (int i = 0; i < _datas.count; i++) {AMapPOI* a = _datas[i];if ([p.name isEqual:a.name]) {j = 1;}}if (j == 0) {//搜索结果存在数组[self.datas addObject:p];}}dispatch_async(dispatch_get_main_queue(), ^{// UI更新代码[self.tableView reloadData];});}

然后就可以实现联想搜索地点了,这个控件这里用的比较简单,后面如果深入使用会来补充的。

iOS——UISearchController(地图联想搜索Demo)相关推荐

  1. ios百度地图地址搜索功能-在线建议查询

    最近使用到了百度地图,总结一下,话不多说直接上代码: 使用的是searchBar+在线建议查询 一.准备工作 导入头文件#import <BaiduMapAPI_Search/BMKSearch ...

  2. iOS 高德地图定位并进行周边搜索

    项目需要实现仿微信朋友圈可定位.搜索附近位置的功能: 实现方法 第1步,集成SDK(这里使用 CocoaPods 安装) pod 'AMapSearch' #地图SDK搜索功能 pod 'AMapLo ...

  3. layui+腾讯地图坐标点选取插件,支持地址关键字模糊/联想搜索、当前城市定位、地址地图标点联动

    插件地址: TMap: layui+腾讯地图坐标点选取插件,支持地址关键字模糊/联想搜索.当前城市定位.地址地图标点联动 实际项目中的案例图: html部分: <div class=" ...

  4. iOS - UISearchController

    前言 NS_CLASS_DEPRECATED_IOS(3_0, 8_0, "UISearchDisplayController has been replaced with UISearch ...

  5. iOS原生地图与高德地图的使用

    原生地图 1.什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位 2. ...

  6. iOS开发--地图与定位

    iOS开发--地图与定位 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们 ...

  7. iOS UISearchController和UITableView

    In this tutorial, we'll be developing an application that implements a search function over a TableV ...

  8. 【高德LBS开源组件大赛】iOS版地图选中Overlay功能组件

    2019独角兽企业重金招聘Python工程师标准>>> ##开源组件名称 iOS版地图选中Overlay功能组件​ ##开源组件说明及使用场景 提供在iOS版地图中选中Overlay ...

  9. iOS高德地图路径选择

    新公司的一个物流项目用到了高德地图的路径规划导航.之前没用过高德的路径规划,最麻烦的是画出路径,以及多路径情况下的点击选择路径. 其实画出路径的算法在高德地图的相关demo里面有,只要抠出来就行.我要 ...

最新文章

  1. 个人在iOS开发过程中真机调试遇到的问题及解决方法
  2. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
  3. 【windows10 计划任务】【实施工程师】
  4. 隐藏帐户与隐藏权限的添加
  5. 开源资产管理系统_部署开源夜莺运维监控平台V3版本
  6. shell脚本语之运算符
  7. 参与就有1000块,30W奖池你占一半 | 帆软开发者大赛招募
  8. ACLEMNLP'21 | 基于神经转移模型的论辩挖掘任务
  9. C#开发Android应用实战
  10. idea + tomcat中文乱码处理
  11. Plotly基础教程
  12. 互联网晚报 | 9月16日星期五 | ​B站回应诉争“哔哩哔哩”商标被驳回;​苹果占国内高端机70%份额;​蔚来手机被曝明年发布...
  13. 立体视觉相机使用JetsonTX2提升图像
  14. MT4-EA自动化交易研究笔记(2022-06-24)
  15. 在c语言中int i k d,c语言int *pInt=(int *)d; 什么意思?
  16. 真无线蓝牙耳机哪个延迟最低?低延迟蓝牙耳机推荐
  17. OS20190301
  18. volatile(粗浅理解)
  19. Python 爬取携程所有机票
  20. PHP安装包TS和NTS的区别

热门文章

  1. win api 路径操作函数
  2. 头盔佩戴检测(行人跟踪技术检测)
  3. 形态学运用(去除图像噪点,提取水平线,垂直线)--OPenCV08
  4. 凌晨三点的战役……让俺激动的没有一丝的困意(原创)
  5. 出差日程安排软件哪个好
  6. 【加拿大签证】加拿大政府指定的签证办理中国体检医院一览【2019官方最新版,加拿大签证体检必看】
  7. ps奥顿柔焦效果+提取线稿
  8. px转vw和rem配置-vue-行内样式px转vw和rem-----项目中无需出现rem单位;
  9. gnuplot软件学习笔记
  10. gnuplot下载地址