2013-09-28 108 views
20

取消搜索條的按鈕在這是應該在iOS 6和iOS 7,嵌入在導航欄的搜索欄的取消按鈕運行一個應用程序,如果應用程序不再被示出在iOS 7上運行。在iOS 6上運行。的iOS 7不顯示導航欄

搜索欄是在導航欄的標題視圖,並且如果搜索欄變成第一響應者取消按鈕應顯示:

的iOS 7

enter image description here

iOS 6

enter image description here

在一個獨立的測試情況下,代碼很簡單:

@interface MyViewController : UITableViewController<UISearchBarDelegate> 

@property (nonatomic) IBOutlet UISearchBar* searchBar; 

@end 


@implementation MyViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationItem.titleView = self.searchBar; 
} 

- (void) searchBarTextDidBeginEditing: (UISearchBar*) searchBar { 
    [searchBar setShowsCancelButton: YES animated: YES]; 
} 

@end 

這是iOS中7故意改變我的文檔中錯過了什麼?如果是的話,那應該是什麼選擇?

如果沒有,我已經改變了我的代碼錯了嗎?

+0

有您爲的UISearchBar委託? – ppaulojr

+2

是的,我已經設置在界面生成器和'searchBarTextDidBeginEditing委託:'如預期調用。否則,它不適用於iOS 6。 – Codo

回答

14

它看起來像你正確地做的一切,但顯然蘋果已經圍繞一些事情改變了iOS的7 According to this SO question中的iOS 7的取消按鈕不會出現在嵌入UINavigationBar一個UISearchBar

根據該developer documentation,所述showsCancelButton屬性可以具有比setShowsCancelButton:Animated方法稍微不同的效果。嘗試這樣做:

searchBar.showsCancelButton = YES; 
[searchBar setShowsCancelButton:YES animated:YES]; 

我不確定這是否會產生任何影響。您也可以嘗試把代碼在不同的委託方法:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar; // return NO to not become first responder 
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar; // called when text starts editing 

您可能還需要簽出iOS 7 changelog。它看起來當添加到UINavigationBar就像蘋果改變行爲或UISearchDisplayController/UISearchBar。看看下的UIKit節最後一顆子彈點(雖然目前尚不清楚到底是什麼改變)。


您可能還想嘗試使用UISerachDisplayController。什麼可能是更容易的嵌入UISearchBarUITableView的頭。

+1

「的showsCancelButton酒店距離setShowsCancelButton不同:動畫法」 - 在你的文檔閱讀?該方法是一種用動畫設置屬性的方法。 – Bryan

+0

謝謝你提出的所有建議。我無法確認'showsCancelButton'和'setShowsCancelButton:animated:'不相關。如果我使用你的代碼,問題仍然存在於iOS 7上,而iOS 6上的動畫不再有效。將代碼移到不同的委託方法也沒有任何影響。 iOS 7更新日誌中的最後一個重點是我意識到的改進,但它不會影響我的問題,因爲我沒有使用「UISearchDisplayController」。 – Codo

+0

你最好的提示是參考其他SO問題。這樣,出現取消按鈕。但是,搜索欄樣式會發生變化,並且搜索欄的大小將需要額外的努力。它確實看起來好像搜索欄故意表現不同,如果它嵌入在導航欄中。瞭解這一變化背後的想法會很有趣。 – Codo

1

在iOS6和iOS7之間似乎有所變化,因爲從xxxDidYYY方法有時不會改變UI,並且您必須在xxxWillYYY方法或從主事件循環執行的某些代碼中執行此操作(例如,在一個區塊內或在短暫的延遲之後)。

在你的情況,試試這個:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 
{ 
    searchBar.showsCancelButton = YES; 
    return YES; 
} 
+1

我試過你的代碼,但它不會改變任何東西。即使我將搜索欄配置爲始終顯示取消按鈕,它也不會顯示它。所以這個問題似乎與使用委託方法無關。 – Codo

2

的iOS 7是在導航欄上與iOS 6種不同的,所以如果你想顯示在導航欄UISearch欄,你可以試試這個:

穿上這樣[self.searchView addSubview self.searchBar]一個UIView你的UISearchBar,以及導航欄的titleview的設置爲您搜索查看這樣self.navagitioncontroller.navigationItem.titleView = self.searchView

希望它爲你工作

2

如果您正在使用的UISearchBar與UISearchDisplayController,你可以簡單地設置取消按鈕顯示,在「searchDisplayControllerWillBeginSearch」委託方法,像這樣:(適用於iOS 7測試)

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{ 
    controller.searchBar.showsCancelButton = YES; 
} 
+0

如果UISearchBar位於導航欄中,則不顯示取消按鈕。 UISearchDisplayController在這裏沒有幫助。如果UISearchBar放在UITableView的頭部並與UISearchDisplayController結合使用,則會顯示取消按鈕,但如果UITableView的滾動視圖不位於頂部,則不會對輕敲事件做出反應。這有點混亂。 – Codo

12

我已經解決了這個問題簡單,只需通過添加rightBarButtonItem :)

self.navigationItem.titleView = self.searchBar; 
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) style:UIBarButtonItemStylePlain target:self action:@selector(didClickCancelButton:)] autorelease]; 

但務必要檢查,如果當前的iOS版本爲> = 7.0,否則你將得到兩個「取消」按鈕..

BTW這種方法允許你去有「取消」按鈕,始終啓用

+1

我喜歡這個答案。它使事情變得簡單,並且不會試圖對抗內置行爲並給予完全控制。 – zekel

+0

簡單而優雅。很好的思想! – Aron

1

在我看來,這是一個錯誤。繼承人我的解決方法。它並不完美,但它的作品都在iOS 6 & 7.在iOS7搜索欄文本框滑過取消按鈕,而它的淡出和iOS6的文本字段寬度擴張沒有設置動畫。

@interface FTViewController() 
@property(nonatomic, strong) UISearchBar *searchBar; 
@end 

@implementation FTViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.searchBar = [[UISearchBar alloc] init]; 
    self.searchBar.delegate = self; 

    if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) { 
     // iOS 6.1 and older (only tested on 6.1) 
     [self.searchBar sizeToFit]; 
     self.searchBar.backgroundImage = nil; 
    } 

    self.navigationItem.titleView = self.searchBar; 
} 

-(void)cancelBarButtonItemClicked:(id)sender 
{ 
    [self searchBarCancelButtonClicked:self.searchBar]; 
} 

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
    [self.navigationItem setRightBarButtonItem:nil animated:YES]; 
} 

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 
{ 
    UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelBarButtonItemClicked:)]; 
    [self.navigationItem setRightBarButtonItem:cancelBtn animated:YES]; 

    return YES; 
} 
@end 
1

有兩種選擇:

  1. 添加一個搜索欄就像一個子視圖uiviewcontroller.view和隱藏的導航欄,如果需要
  2. 添加一個取消按鈕uiviewcontroller.navigationItem.rightBarButtonItem

我的偏好是第二個,但它看起來比第一個更原生。

+0

因爲我有其他需要顯示的導航欄按鈕項目,所以我選擇了選項2。 – DonnaLea

1

這實際上是一個固定的7.1版本的bug。