说明:本文主要是将系统UISearchController控件声明文件中的属性、方法、代理等介绍下,后续再联合【搜索栏UISearchBar】这篇文章一起更新更实用的信息。
1、初始化
// 如果设置searchResultsController参数为nil,代表搜索后的结果不显示在当前控制器之上 - (instancetype)initWithSearchResultsController:(UIViewController *)searchResultsController;
2、代理
@property(nonatomic, weak) id<UISearchControllerDelegate> delegate;
UISearchControllerDelegate:
// 当用户在搜索控制器中开始编辑时或者将active属性设置为YES时,该方法被调用 - (void)presentSearchController:(UISearchController *)searchController; // 当搜索控制器即将出现时 - (void)willPresentSearchController:(UISearchController *)searchController; // 当搜索控制器已经出现时 - (void)didPresentSearchController:(UISearchController *)searchController; // 当搜索控制器即将消失时 - (void)willDismissSearchController:(UISearchController *)searchController; // 当搜索控制亲已经消失时 - (void)didDismissSearchController:(UISearchController *)searchController;
3、管理搜索结果
// 在呈现搜索控制器执之前,将搜索栏放置在视图控制器界面的某个位置。点击搜索栏为起点。与搜索栏的交互是由UISearchController自动处理的 @property(nonatomic, strong, readonly) UISearchBar *searchBar; // 该协议是用来监控将搜索结果传递到搜索结果控制器的过程的 @property(nonatomic, weak) id<UISearchResultsUpdating> searchResultsUpdater; // 搜索结果控制器 @property(nonatomic, strong, readonly) UIViewController *searchResultsController; // 当用户点击搜索栏后,搜索控制器会出现,并且搜索结果控制器也会自动的显示出来。通常利用这个属性是为了确定当前是否显示了搜索结果。但是也可以将此属性设置为YES,这样就会强制显示出搜索界面。 默认为NO @property(nonatomic, assign, getter=isActive) BOOL active;
UISearchResultsUpdating:
// 只要搜索栏成为第一响应者或者对搜索栏中的文本进行更改,就会自动调用此方法。在此方法中进行过滤或者更新 - (void)updateSearchResultsForSearchController:(UISearchController *)searchController;
4、配置搜索界面
// 当此属性为YES时,只要用户与搜索栏进行交互,搜索控制器就会遮住包含可搜索内容的视图控制器。当此属性为NO时,搜索控制器不会遮住原始视图控制器。该属性仅仅是控制原始视图控制器是否最初被遮挡。当用户开搜索栏中输入文本时,搜索控制器就会立即显示搜索结果控制器和结果。 // 如果使用同一个控制器来显示可搜索内容和搜索结果,建议将此属性设置为NO。此属性的默认为YES @property(nonatomic, assign) BOOL obscuresBackgroundDuringPresentation; // 在搜索过程中底层内容是否变暗 @property(nonatomic, assign) BOOL dimsBackgroundDuringPresentation; // 当出现搜索控制器的时候是否隐藏导航栏。默认为YES @property(nonatomic, assign) BOOL hidesNavigationBarDuringPresentation;
二、使用过程中注意的问题
1、如果将UISearchController中的属性searchBar作为导航栏的titleView,在iOS11以后,导航栏的高度将不再是44,而是56。接下来的话,需要对导航栏上面的其他控件,比如返回按钮重新进行位置的调整。