2014-12-29 195 views
4

我正在嘗試獲取搜索欄,它的範圍在導航欄中,就像視圖第一次出現的方式一樣。如果只需將UISearchBar拖放到界面構建器中的表視圖控制器上,它將像表頭一樣放置在表格中。然後,當你點擊它時,它會動畫進入我之後的編隊。問題是我希望它無需任何點擊開始了這種方式,在左側後退按鈕,沒有取消右鍵:iOS:在導航欄中顯示搜索欄時隱藏示波器欄

enter image description here

所以,給搜索欄當前的工作重點,而不攻,我試圖在viewDidLoad中添加[_searchBar becomeFirstResponder];,它不起作用。接下來我想:

self.searchDisplayController.displaysSearchBarInNavigationBar = YES; 

搜索欄將在導航欄中顯示的確但範圍欄消失了,(爲什麼蘋果WHY),有一個尷尬的差距。

enter image description here

我也試着子類UINavigationBar的,使之高。很容易改變它的大小,但內容對齊在欄的底部,並重疊任何你想添加的內容。

所以要重新迭代,當視圖第一次出現時,我需要在導航欄中顯示搜索欄,而不需要用戶點擊。我還應該指定這是在UITableViewController上(因爲該頁面有一個UIRefreshConrol),所以簡單地將工具欄放在表視圖上方不是一個選項。謝謝。

回答

4

tl; dr:不要。

你應該知道,加入UISearchBarUITableViewheaderView調用內UIKit便於隱藏在啓動範圍酒吧一些自定義代碼。儘管在iOS 6和更舊的版本中,它一直很容易顯示範圍欄,但iOS 7已經改變了這一點。

你的第一種方法,becomeFirstResponderviewDidLoad是一個好主意,但是這個方法是在視圖加載到內存之後調用的(比如在NIB之外)。該視圖尚未添加到視圖層次結構中,因此它不能成爲第一響應者。 viewDidAppear:在之後被稱爲正確視圖被加載到視圖層次結構中,並且becomeFirstResponder實際上允許UISearchBar接收焦點。

範圍欄本身是一個隱藏的(默認)子視圖UISearchBar。您在技術上可以通過子視圖循環並將其設置爲不隱藏:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self recurseSubviewsForView:self.searchDisplayController.searchBar]; 
} 

- (void)recurseSubviewsForView:(UIView *)view 
{ 
    for (UIView *subview in view.subviews) { 
     if ((CGRectGetMinY(subview.frame) == CGRectGetMaxY(self.searchDisplayController.searchBar.frame)) && subview.hidden) { 
      subview.hidden = NO; 
      self.searchDisplayController.searchBar.showsScopeBar = YES; 
      [self.searchDisplayController.searchBar sizeToFit]; 
     } 
     [self recurseSubviewsForView:subview]; 
    } 
} 

這通常是一個壞主意。有一個基本的檢查,看看作爲目標的子視圖是一個包含範圍欄子視圖,但可以打破任何一秒,可能不是向後兼容等

你要問自己真正的問題是爲什麼我希望範圍欄始終可見嗎?現在它的工作方式是,當用戶點擊搜索字段並在搜索字段不再具有焦點時隱藏自身,範圍欄將顯示動畫。即使是上面的「黑客」,只要用戶點擊一個範圍按鈕,搜索欄就會獲得焦點。當搜索甚至不活躍時,顯示搜索選項的意義何在?如有疑問,回落到Apple的建議。從長遠來看,它會讓你的生活變得更加輕鬆,並且可能會讓你的應用看起來更好,行爲更好。蘋果公司並不只是隨心所欲地加入這種互動。他們像瘋了一樣測試它。這就是爲什麼要以另一種方式工作很難。這就是爲什麼當UISearchBarUITableViewheaderView ...時有特殊的代碼運行,因爲它對用戶來說可能更好。另外,我看到你的屏幕截圖爲iOS 8,但你的代碼縮減顯示使用UISearchDisplayController。這種範例已被棄用,有利於UISearchController。請考慮更新。

+0

沮喪,我沒有想'將'becomeFirstResponder'放在'viewDidAppear:'中。謝謝!回答你的問題:我希望它始終可見bc VC專門用於搜索。 (看看Instagram的搜索選項卡 - 這就是我所追求的)此外,有一個很好的理由使用「UISearchDisplayController」 - 兼容iOS7。它可能會在iOS8中被棄用,但它仍然是完全有效的(並且仍然在IB中的對象庫中)。問題仍然存在:如果您使用該選項在導航欄中顯示搜索欄,爲什麼Apple會隱藏該範圍,而不考慮設置'showsScope = YES'? – inorganik

+1

它爲什麼隱藏範圍欄?我不知道,但[它被記錄](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchDisplayController_Class/index.html#//apple_ref/occ/instp/UISearchDisplayController/displaysSearchBarInNavigationBar )。 *「如果您在顯示在導航欄中的搜索欄中將'showsScopeBar'屬性設置爲'YES',則系統會引發異常。」*可能因爲導航欄高度不足以顯示範圍欄。 – greg