UISearchController簡(jiǎn)直就是坑

項(xiàng)目中需要使用搜索功能溉浙,之前都是使用UISearchBar+UISearchDisplayController或者如果你需要高度定制搜索框應(yīng)該用UITextField加上點(diǎn)擊事件完成。因?yàn)橄胪祽校揖褪褂昧薸OS 8.0以后推出的新類UISearchController弄匕,畢竟我們的項(xiàng)目只是向下適配到8.0, 為了避免以后廢棄API等問(wèn)題籽慢,我就直接使用了UISearchController,結(jié)果發(fā)現(xiàn)各種坑.


1.我先粘出在問(wèn)題的截圖

在我使用UISearchController的過(guò)程中,遇到了一個(gè)奇葩的問(wèn)題竣贪,我的展示界面和搜索界面是同一個(gè)界面帚湘,就是下面這句代碼
//創(chuàng)建UISearchController _searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
我沒(méi)有單獨(dú)創(chuàng)建一個(gè)UITableViewContrller用來(lái)展示搜索后的數(shù)據(jù)源內(nèi)容玫荣,這樣點(diǎn)擊searchBar后,UISearchBar會(huì)自動(dòng)占據(jù)導(dǎo)航欄(其實(shí)是一個(gè)屬性hidesNavigationBarDuringPresentation)大诸,置為YES捅厂,點(diǎn)擊searchBar后會(huì)自動(dòng)隱藏導(dǎo)航欄(如下圖),我建議將此屬性置為true资柔,否則將導(dǎo)致UISearchBar在導(dǎo)航欄下下沉44的高度焙贷。出現(xiàn)此問(wèn)題的原因下面會(huì)提到。

WechatIMG1.jpeg

我出現(xiàn)的問(wèn)題是下面這張截圖所示

問(wèn)題截圖

每次點(diǎn)擊searchBar出現(xiàn)左上第一個(gè)界面贿堰,此時(shí)點(diǎn)擊取消按鈕辙芍,返回展示界面,但是UISearchBar會(huì)往上偏移羹与,如右上界面所示故硅,我是真的無(wú)語(yǔ)了,而且這個(gè)問(wèn)題只在iOS 9.0以下出現(xiàn)注簿,在9.0以上是好的契吉。導(dǎo)航欄會(huì)遮擋UISearchBar,每次返回都會(huì)向上偏移20的高度诡渴。

在網(wǎng)上找到的解決方案有以下幾種:

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

方案1捐晶,設(shè)置definesPresentationContext為true,可以保證在UISearchController在激活狀態(tài)下用戶push到下一個(gè)view controller之后search bar不會(huì)仍留在界面上妄辩。但我之前說(shuō)明了我的展示界面和搜索界面是同一個(gè)控制器惑灵。所以這個(gè)方案并沒(méi)有解決我的問(wèn)題。
蘋果對(duì)它官方的解釋是// know where you want UISearchController to be displayed
a眼耀、如果不添加上面這行代碼英支,在設(shè)置hidesNavigationBarDuringPresentation這個(gè)屬性為YES的時(shí)候,搜索框進(jìn)入編輯模式會(huì)導(dǎo)致哮伟,searchbar不可見干花,偏移-64;
在設(shè)置為NO的時(shí)候,進(jìn)入編輯模式輸入內(nèi)容會(huì)導(dǎo)致高度為64的白條楞黄,猜測(cè)是導(dǎo)航欄沒(méi)有渲染出來(lái)
b池凄、如果添加了上面這行代碼,在設(shè)置hidesNavigationBarDuringPresentation這個(gè)屬性為YES的時(shí)候鬼廓,輸入框進(jìn)入編輯模式正常顯示和使用;在設(shè)置為NO的時(shí)候肿仑,搜索框進(jìn)入編輯模式導(dǎo)致向下偏移64,具體原因暫時(shí)未找到

方案2:當(dāng)你沒(méi)有設(shè)置searchBar的frame時(shí),這行代碼可以幫助你調(diào)整searchBar的位置尤慰。只是輔助作用馏锡,其實(shí)UISearchBar的默認(rèn)高度就是44,

方案3:translucent屬性的設(shè)置與否伟端,與self.view的Frame的位置相關(guān)杯道。當(dāng)translucent設(shè)為NO時(shí),self.view的位置荔泳,從navbar下邊界開始蕉饼。反之亦然。這也沒(méi)有解決我的問(wèn)題

2.下面是我在網(wǎng)上粘的可以用的示例

viewDidLoad中的代碼
1.其中[self shuffledAlphabet] 是個(gè)產(chǎn)生三個(gè)隨機(jī)字母的方法,其中該類需要遵循四個(gè)代理方法玛歌,包含UITableViewDelegate,UITableViewDataSource擎椰,UISearchControllerDelegate支子,UISearchResultsUpdating。因?yàn)閁ISearchController都是和UITableView配合使用的达舒。
2.[self shuffledAlphabet]方法截圖
方法截圖
3.遵循UITableViewDataSource協(xié)議的方法
數(shù)據(jù)源

datalist是原始數(shù)據(jù)值朋,searchList是搜索后的數(shù)據(jù)內(nèi)容。

4.遵循UISearchResultsUpdating協(xié)議的方法巩搏,該方法是對(duì)搜索內(nèi)容進(jìn)行篩選的方法
截圖 2016-09-12 11時(shí)04分44秒.jpg

圖中藍(lán)色框圈住的代碼昨登,是因?yàn)槲翼?xiàng)目中需要修改UISearchController中UISearchBar的取消按鈕的顏色和文字,我使用的KVC的方式去修改的贯底,還有遍歷UISearchBar的子控件方式去修改丰辣。默認(rèn)的取消按鈕的文字是Cancel

5.遵循UISearchControllerDelegate協(xié)議的方法
分為五個(gè)階段

直接使用上面的示例代碼,就可以解決我出現(xiàn)的問(wèn)題禽捆,使用上面的示例代碼笙什,一定記住要將searchController的searchBar添加到tableView的tableHeaderView,之前我是直接將searchBar添加到了self.view上胚想,并且也沒(méi)有設(shè)定它的frame.[self.view addSubview:_searchController.searchBar];

最讓我郁悶的是我寫了個(gè)demo測(cè)試琐凭,完全沒(méi)問(wèn)題,但是粘進(jìn)我的項(xiàng)目中使用浊服,就會(huì)出現(xiàn)之前的問(wèn)題统屈,經(jīng)過(guò)我的部分修改終于解決了上移問(wèn)題,我懷疑是Xcode犯病了牙躺,但是同時(shí)又會(huì)冒出來(lái)一個(gè)新問(wèn)題愁憔,如下圖

WechatIMG356.jpeg

搜索出現(xiàn)的結(jié)果,cell的部分會(huì)和searchBar重疊述呐,為了解決這個(gè)問(wèn)題惩淳,我在下面這兩個(gè)代理方法中,加了幾行代碼

截圖

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

簡(jiǎn)書里還有一篇文章介紹了這種情況思犁,下面是鏈接代虾,你可以參考下。
UISearchController淺析

總結(jié)的有點(diǎn)亂激蹲,有什么不懂的你可以留言問(wèn)我棉磨,很久沒(méi)發(fā)文了,以后會(huì)整理項(xiàng)目中遇到的問(wèn)題学辱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乘瓤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子策泣,更是在濱河造成了極大的恐慌衙傀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萨咕,死亡現(xiàn)場(chǎng)離奇詭異统抬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)危队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門聪建,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人茫陆,你說(shuō)我怎么就攤上這事金麸。” “怎么了簿盅?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵挥下,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我挪鹏,道長(zhǎng)见秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任讨盒,我火速辦了婚禮解取,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘返顺。我一直安慰自己禀苦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布遂鹊。 她就那樣靜靜地躺著振乏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秉扑。 梳的紋絲不亂的頭發(fā)上慧邮,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天调限,我揣著相機(jī)與錄音,去河邊找鬼误澳。 笑死耻矮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忆谓。 我是一名探鬼主播裆装,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼倡缠!你這毒婦竟也來(lái)了哨免?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤昙沦,失蹤者是張志新(化名)和其女友劉穎琢唾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桅滋,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慧耍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丐谋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煌珊,死狀恐怖号俐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情定庵,我是刑警寧澤吏饿,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蔬浙,受9級(jí)特大地震影響猪落,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畴博,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一笨忌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俱病,春花似錦官疲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至溢吻,卻和暖如春维费,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工犀盟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留而晒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓且蓬,卻偏偏與公主長(zhǎng)得像欣硼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恶阴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容