UISearchBar的取消和清除button不起作用在iOS 7中

我有一个xCode项目,其中包含一个“search栏和search显示控制器”的桌面视图,允许用户优化显示项目的列表。 一般来说,遵循http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view提供的指导。 我最近下载了支持iOS 7的最新xCode(版本5.0(5A1413)),并且针对不同的目标testing了有问题的应用程序。

在iOS 6目标(模拟器或实际设备)上运行此应用程序时,按预期方式工作意味着按取消button将删除search栏并按清除button(灰色小x)会清除所有已经键入的search条件用户。 但是当项目在iOS 7目标上运行时,清除和取消button都不起作用。

searchBarCancelButtonClicked方法是在这个项目中实现的,我已经validation了它在目标运行iOS 7时不被调用。

- (void)searchBarCancelButtonClicked:(UISearchBar *)SearchBar { NSLog(@"searchBarCancelButtonClicked called"); self.searchBar.text = nil; … // Hide Search bar when cancelled [self hideSeachBar]; [self.searchBar resignFirstResponder]; … } 

我的表视图控制器设置为UISearchDisplayDelegate和UISearchBarDelegate。 看起来,这仍然是作为searchBar:textDidChange:在iOS 6或7目标上调用。

 @interface ItemViewController () <UISearchDisplayDelegate, UISearchBarDelegate> … @end 

我看不到任何其他与此或任何iOS 7更改材料相关的post(如https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html#//apple_ref/doc/uid / TP40013174-CH8-SW1 ),其中提到需要进行任何重新编码才能支持iOS7。

对此有何想法? 谢谢

我有同样的问题,我试着用下面的代码。 请试试这个。

 -(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller { controller.active = YES; [self.view addSubview:controller.searchBar]; [self.view bringSubviewToFront:controller.searchBar]; } - (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { tableView.frame = self.archiveListTblView.frame; } - (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { controller.active=NO; [self.view addSubview:controller.searchBar]; } 

button取消和button清除将不起作用,如果你触摸buttonsearch导航。 如果你点击search栏星号search,它正常工作=>这意味着如果search栏不能在屏幕上看到之前凝视search,那么这些button看起来像禁用了。

所以,我find了一个解决scheme,但它并不完全完美。 在使search栏成为第一个响应之前,必须将表视图滚动到顶部。 试试这个代码。

 -(IBAction)goToSearch:(id)sender { // Make search bar visible on screen before make it response [_tableView setContentOffset:CGPointMake(0, 0) animated:NO]; // Make search bar active [candySearchBar becomeFirstResponder]; } 

唯一的问题发生,如果你这样做,是你的表视图将滚动到顶部,这意味着当你取消search,你失去了当前的细胞索引之前。

这个问题似乎来自导航栏中半透明属性的新行为。

由于默认iOS 7导航栏是半透明的。 它看起来像重叠search栏,当你按下button后显示它。 如果您滚动到listView的顶部,并使用search栏,它应该正常工作。

尝试在您的控制器中设置:

 float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if (osVersion >= 7.0) { self.navigationController.navigationBar.translucent = NO; } 

这应该很快解决问题。

但我认为,为了更好地解决问题,你应该看到iOS 7的转换指南 ,他们解释了如何处理半透明的导航条。

希望有所帮助。

我也有这个问题。 奇怪的是UISearchBarDelegate其他委托方法正在被调用。 解决方法可能是:

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ if ([searchText length] == 0) { NSLog("No Text"); } } 

它为我工作

我search了互联网,并找不到解决scheme。 所以我改变了UItableview的行为。

而不是[searchBar becomeFirstResponder]; 我向下滚动tableview。

 - (IBAction)goToSearch:(id)sender { scroll down to show the table. // CGRect newBounds = self.TableView.bounds; // newBounds.origin.y =0; // // self.TableView.bounds = newBounds; //[searchBar becomeFirstResponder]; CGPoint contentOffset=self.TableView.contentOffset; contentOffset.y=0; [self.TableView setContentOffset:contentOffset animated:YES]; } 

在我的ViewDidload中:

 // CGRect newBounds = self.TableView.bounds; // newBounds.origin.y = newBounds.origin.y + searchBar.bounds.size.height; // self.TableView.bounds = newBounds; CGPoint contentOffset=self.TableView.contentOffset; contentOffset.y=self.TableView.bounds.origin.y + searchBar.bounds.size.height; self.TableView.contentOffset=contentOffset; 

如果find某些原因,在iOS 7中,更改表视图边界导致search栏消失。 希望有所帮助。

在我的情况下,我已经将search栏重新定位到屏幕的顶部,并且在search栏上有一个不可见的视图。

因此取消button实际上没有被触动。

所以,我在下面调用[searchBarTextDidBeginEditing]方法的时候带了seachbar front。

 -(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ lc_SearchBarYPos.constant = 20.0f; //this is code to reposition the searchbar [self.view bringSubviewToFront:searchBar]; } 

希望这可能有帮助。