IOS7:uisearchdisplaycontroller总是显示范围栏

基本上我想实现的是让我的范围栏永远不会消失。

环境:IOS 7,故事板,视图控制器里面我有一个“search栏和search显示控制器”和一个单独的tableview(search栏不在表格内)

在视图controller.h中

@property (nonatomic, strong) IBOutlet UISearchBar *candySearchBar; 

在视图controller.m里面

 @synthesize candySearchBar; 

我试过的:在一个自定义的search栏里面

 - (void) setShowsScopeBar:(BOOL) showsScopeBar { if ([self showsScopeBar] != showsScopeBar) { [super invalidateIntrinsicContentSize]; } [super setShowsScopeBar:showsScopeBar]; [super setShowsScopeBar: YES]; // always show! NSLog(@"setShowsScopeBar searchbar"); NSLog(@"%hhd", showsScopeBar); } 

 searchBarDidEndEditing 

同样的事情在视图控制器,但然后

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [candySearchBar setShowsScopeBar:YES]; [candySearchBar sizeToFit]; } 

我希望我的问题是清楚的,我尝试了很多遍布互联网的解决scheme,其中大部分都讨论了setshowsscopebar,但似乎并不奏效。 setshowscopebar中日志的输出是1,但是scopebar仍然没有显示。

我仍然认为自己对代码是陌生的,错误仍然是一个新手的错误。

编辑:视图控制器中的另一块代码,你可以看到我正在寻找盲目的:

 -(void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{ self.searchDisplayController.searchBar.showsCancelButton = YES; self.searchDisplayController.searchBar.showsScopeBar = YES; controller.searchBar.showsScopeBar = TRUE; controller.searchBar.frame = CGRectMake(0, 149, 768, 88); UIButton *cancelButton; UIView *topView = self.searchDisplayController.searchBar.subviews[0]; for (UIView *subView in topView.subviews) { if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) { cancelButton = (UIButton*)subView; } } if (cancelButton) { //Set the new title of the cancel button [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal]; [cancelButton setEnabled:YES]; controller.searchBar.showsScopeBar = YES; //candySearchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"Flags", @"Listeners", @"Stations", nil]; } NSLog(@"%@",NSStringFromCGRect(controller.searchBar.frame)); NSLog(@"%@",NSStringFromCGRect(controller.searchBar.bounds)); NSLog(@"%hhd@",controller.searchBar.hidden); } 

你试过的代码不能在iOS7以上工作,因为苹果已经改变了UISearchBar行为,当返回到普通视图时隐藏范围。 将此方法添加到您的自定义searchBar类。

 -(void)layoutSubviews { [super layoutSubviews]; if([[UIDevice currentDevice].systemVersion floatValue]>=7.0) { //Get search bar with scope bar to reappear after search keyboard is dismissed [[[[self.subviews objectAtIndex:0] subviews] objectAtIndex:0] setHidden:NO]; [self setShowsScopeBar:YES]; } } 

在索引处直接访问对象可能会导致iOS6中的应用程序崩溃,因为iOS6和iOS7之间的视图层次结构不同,为了避免这种情况发生,如果条件仅在iOS7时添加,

另外这也是在自定义search栏类中需要的

 -(void) setShowsScopeBar:(BOOL)showsScopeBar { [super setShowsScopeBar:YES]; //Initially make search bar appear with scope bar } 

我有同样的问题。 也许这是iOS7中的变化,因为显示范围栏应该是默认的行为。 您可以在以下教程的“ 创build可选范围栏以过滤结果节中validation这一点:

http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view

希望有人有这个解决scheme; 否则我们将不得不寻找一个解决方法。

初始化设置范围栏NO

 [self.searchBar setShowsScopeBar:NO]; [self.searchBar sizeToFit]; //default scope bar selection self.searchBar.selectedScopeButtonIndex=3; 

从scopeBarcheckbox中取消select/删除勾号

在这里输入图像说明

如果没有自定义的search条,可能会(但是很冒险),这与CoolMonster的build议非常相似。

在您的TableViewController中,search结束后将显示ScopeBar:

 - (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { //Show the scopeBars controller.searchBar.showsScopeBar = YES; //Resize the searchBar to show ScopeBar controller.searchBar.frame = CGRectMake(0, 0, 320, 88); if([[UIDevice currentDevice].systemVersion floatValue]>=7.0) { [[[[controller.searchBar.subviews objectAtIndex:0] subviews] objectAtIndex:0] setHidden:NO]; } } 

然后,因为您可能希望它出现在您search之前,将此行添加到TableViewController的viewDidLoad:

  [self searchDisplayControllerDidEndSearch:self.searchDisplayController]; 

为了logging,在得到这个工作之后,我最终使用了一个单独的分段控制,而不是上面的方法,原因有几个,其中一个就是触及一个SearchBar的ScopeBar,一旦你显示它,启动search显示tableView,这是有道理的,如果你使用它推荐的方式。 但是,因为我希望ScopeBar在不启动searchtableview的情况下工作,对我来说,使用我自己的分段控件并将其添加到searchBar下的tableHeaderView中更有意义。