iOS 7不显示导航栏中search栏的取消button

在应该在iOS 6和iOS 7上运行的应用程序中,如果应用程序在iOS 7上运行,则导航栏中embedded的search栏的取消button不再显示。在iOS 6上运行。

search栏位于导航栏的标题视图中,如果search栏成为第一个响应者,则应显示取消button:

IOS 7

在这里输入图像说明

iOS 6

在这里输入图像说明

在一个孤立的testing案例中,代码非常简单:

@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故意改变吗? 如果是的话,那么应该是什么呢?

如果没有,我在我的代码中犯了一个错误?

看起来你正在做的一切正常,但显然苹果已经改变了iOS 7中的一些东西。 根据 iOS 7 中的这个SO问题 ,取消button不会出现在UINavigationBarembedded的UISearchBar

根据开发者文档 , 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更新日志 。 它看起来像苹果改变了行为或UISearchDisplayController / UISearchBar添加到UINavigationBar 。 看看UIKit部分的最后一个要点(尽pipe不清楚到底发生了什么变化)。


您可能还想尝试使用UISerachDisplayController 。 更简单的是将UISearchBarembedded到UITableView的头部。

我已经解决了这个问题很简单,只需要添加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,否则你会得到两个“取消”button。

顺便说一句这种方法允许你有“取消”button,总是启用

iOS 7与导航栏中的iOS 6不同,所以如果你想在导航栏中显示UISearch栏,你可以试试这个:

把你的UISearchbar像这样[self.searchView addSubview self.searchBar] ,并设置导航栏的titleView到你的searchView像这样self.navagitioncontroller.navigationItem.titleView = self.searchView

希望对你有帮助

如果你正在使用你的UISearchBar和UISearchDisplayController,你可以简单地设置取消button来显示,在“searchDisplayControllerWillBeginSearch”委托方法,如下所示:(iOS 7testing)

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

在iOS6和iOS7之间似乎有所改变,因为从xxxDidYYY方法对UI的更改有时不起作用,并且必须在xxxWillYYY方法或从主事件循环执行的某些代码中执行(例如,在阻滞或短暂延迟后)。

在你的情况下,试试这个:

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

在我看来,这是一个错误。 inheritance人我的解决方法。 这不是完美的,但它可以在iOS 6和7上使用。 在iOS7上,search栏文本字段在淡出时在“取消”button上滑动,在iOS6上,文本字段宽度扩展不是animation的。

 @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. 像子视图添加一个search栏到uiviewcontroller.view并隐藏导航栏,如果需要
  2. 向uiviewcontroller.navigationItem.rightBarButtonItem添加一个取消button

我的偏好是第二个,但是它看起来更像第一个。

这实际上是一个从7.1开始修复的bug。