最近常常用到搜索類的佈局,大致是這樣的app
上面是一個navigationController,接下來一個searchBar,下面是tableView佈局
searchBar這個控件就用來搜索tableView上的數據測試
[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];spa
UISearchDisplayController這個控件很強大,它初始化是基於searchBar的,裏面有些效果很不錯,apple都封裝好了,而且能夠很好的支持實時搜索,即咱們只須要將搜索出來的數據從新賦給array(這個array用來存儲tableView數據),不須要reloadData,就會自動出來代理
其實reloadData也沒用,爲何呢?由於搜索出來的結果顯示在tableView上,該tableView並非當前佈局的那個tableView,而是另一個,我猜想應該是UISearchDisplayController裏面自帶的,因此不要混淆了it
特別是在tableView代理方法裏,有時候須要判斷代理方法傳入的tableView是否爲當前佈局的tableView,由於也有多是UISearchDisplayController裏自帶的,它們一樣會觸發代理方法io
當點擊searchBar時,它會自動上移而且遮住navigationControllertable
通過測試,若是上面是navigationBar,則searchBar不會移動,但若是是UINavigationController自帶過來的,則會上移覆蓋搜索
每每有的時候都是UINavigationController自帶過來的,若是使用UISearchDisplayController,searchBar就會自動覆蓋,這個狀況我試了不少次,包括新建立了一個navigationBar蓋在上面,但效果依然很差,對於這種狀況,基於我目前的技術,只能捨棄UISearchDisplayController,單純的用UISearchBar了,雖然效果差了一些,但須要實現的功能照樣能夠,好比實時搜索,除了從新賦值給array外,額外的操做就是須要reloadData了。方法
有時候點擊searchBar時,右側可能沒有出現‘cancel/取消’按鈕,這時須要調用下面的方法
- (void)setShowsCancelButton:(BOOL)showsCancelButton animated:(BOOL)animated
相信看方法名字就知道是作什麼的了