UISearchController簡直就是坑

項目中需要使用搜索功能,之前都是使用UISearchBar+UISearchDisplayController或者如果你需要高度定制搜索框應該用UITextField加上點擊事件完成。因為想偷懶,我就使用了iOS 8.0以后推出的新類UISearchController,畢竟我們的項目只是向下適配到8.0, 為了避免以后廢棄API等問題,我就直接使用了UISearchController,結果發現各種坑.


1.我先粘出在問題的截圖

在我使用UISearchController的過程中,遇到了一個奇葩的問題,我的展示界面和搜索界面是同一個界面,就是下面這句代碼
//創建UISearchController _searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
我沒有單獨創建一個UITableViewContrller用來展示搜索后的數據源內容,這樣點擊searchBar后,UISearchBar會自動占據導航欄(其實是一個屬性hidesNavigationBarDuringPresentation),置為YES,點擊searchBar后會自動隱藏導航欄(如下圖),我建議將此屬性置為true,否則將導致UISearchBar在導航欄下下沉44的高度。出現此問題的原因下面會提到。

WechatIMG1.jpeg

我出現的問題是下面這張截圖所示

問題截圖

每次點擊searchBar出現左上第一個界面,此時點擊取消按鈕,返回展示界面,但是UISearchBar會往上偏移,如右上界面所示,我是真的無語了,而且這個問題只在iOS 9.0以下出現,在9.0以上是好的。導航欄會遮擋UISearchBar,每次返回都會向上偏移20的高度。

在網上找到的解決方案有以下幾種:

1.在-(UISearchController *)searchController方法里加上 self.definesPresentationContext = YES;這行代碼
2.在合適的地方添加[self.searchController.searchBar sizeToFit];
3.在viewDidDisappear方法中添加self.navigationBar.translucent = NO;這行代碼

方案1,設置definesPresentationContext為true,可以保證在UISearchController在激活狀態下用戶push到下一個view controller之后search bar不會仍留在界面上。但我之前說明了我的展示界面和搜索界面是同一個控制器。所以這個方案并沒有解決我的問題。
蘋果對它官方的解釋是// know where you want UISearchController to be displayed
a、如果不添加上面這行代碼,在設置hidesNavigationBarDuringPresentation這個屬性為YES的時候,搜索框進入編輯模式會導致,searchbar不可見,偏移-64;
在設置為NO的時候,進入編輯模式輸入內容會導致高度為64的白條,猜測是導航欄沒有渲染出來
b、如果添加了上面這行代碼,在設置hidesNavigationBarDuringPresentation這個屬性為YES的時候,輸入框進入編輯模式正常顯示和使用;在設置為NO的時候,搜索框進入編輯模式導致向下偏移64,具體原因暫時未找到

方案2:當你沒有設置searchBar的frame時,這行代碼可以幫助你調整searchBar的位置。只是輔助作用,其實UISearchBar的默認高度就是44,

方案3:translucent屬性的設置與否,與self.view的Frame的位置相關。當translucent設為NO時,self.view的位置,從navbar下邊界開始。反之亦然。這也沒有解決我的問題

2.下面是我在網上粘的可以用的示例

viewDidLoad中的代碼
1.其中[self shuffledAlphabet] 是個產生三個隨機字母的方法,其中該類需要遵循四個代理方法,包含UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UISearchResultsUpdating。因為UISearchController都是和UITableView配合使用的。
2.[self shuffledAlphabet]方法截圖
方法截圖
3.遵循UITableViewDataSource協議的方法
數據源

datalist是原始數據,searchList是搜索后的數據內容。

4.遵循UISearchResultsUpdating協議的方法,該方法是對搜索內容進行篩選的方法
截圖 2016-09-12 11時04分44秒.jpg

圖中藍色框圈住的代碼,是因為我項目中需要修改UISearchController中UISearchBar的取消按鈕的顏色和文字,我使用的KVC的方式去修改的,還有遍歷UISearchBar的子控件方式去修改。默認的取消按鈕的文字是Cancel

5.遵循UISearchControllerDelegate協議的方法
分為五個階段

直接使用上面的示例代碼,就可以解決我出現的問題,使用上面的示例代碼,一定記住要將searchController的searchBar添加到tableView的tableHeaderView,之前我是直接將searchBar添加到了self.view上,并且也沒有設定它的frame.[self.view addSubview:_searchController.searchBar];

最讓我郁悶的是我寫了個demo測試,完全沒問題,但是粘進我的項目中使用,就會出現之前的問題,經過我的部分修改終于解決了上移問題,我懷疑是Xcode犯病了,但是同時又會冒出來一個新問題,如下圖

WechatIMG356.jpeg

搜索出現的結果,cell的部分會和searchBar重疊,為了解決這個問題,我在下面這兩個代理方法中,加了幾行代碼

截圖

并且一定要在- (void)updateSearchResultsForSearchController:(UISearchController *)searchController方法中加上這句代碼self.edgesForExtendedLayout = UIRectEdgeNone;//不加的話,UISearchBar返回后會上移

簡書里還有一篇文章介紹了這種情況,下面是鏈接,你可以參考下。
UISearchController淺析

總結的有點亂,有什么不懂的你可以留言問我,很久沒發文了,以后會整理項目中遇到的問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容