IOS7:uisearchdisplaycontroller始终显示范围栏

时间:2013-10-28 15:04:02

标签: ios objective-c ios7 uisearchbardisplaycontrol

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

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

在视图controller.h中。

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

在视图controller.m

@synthesize candySearchBar;

我尝试过:在自定义搜索栏类

- (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];
}

我希望我的问题很明确,我尝试过在互联网上发布的许多解决方案,其中大多数都是关于setshowsscopebar,但它似乎没有用。 setshowscopebar中的日志输出为1,但示波器栏仍未显示。

我仍然认为自己不熟悉代码,故障仍然是一个新手的错误。

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

-(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);
}

4 个答案:

答案 0 :(得分:5)

您尝试的代码在iOS7以后将不起作用,因为Apple在返回正常视图时更改了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的情况下才添加此内容。

此外,自定义搜索栏类

中也需要这样做
-(void) setShowsScopeBar:(BOOL)showsScopeBar {
    [super setShowsScopeBar:YES]; //Initially make search bar appear with scope bar
}

答案 1 :(得分:0)

我有同样的问题。也许它在iOS7中发生了变化,因为显示范围栏应该是默认行为。您可以在以下教程的“创建可选范围栏以过滤结果”部分中进行验证:

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

希望有人为此提供解决方案;否则我们将不得不寻找一种解决方法。

答案 2 :(得分:0)

初始化设置范围栏NO

[self.searchBar setShowsScopeBar:NO];
[self.searchBar sizeToFit];

//default scope bar selection
self.searchBar.selectedScopeButtonIndex=3;

取消选中/删除scopeBar复选框中的勾号

enter image description here

答案 3 :(得分:0)

在没有自定义searchBar的情况下执行此操作是可能的(但是很困难),与CoolMonster建议的方式非常相似。

在TableViewController中,这将在搜索结束后显示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];
    }
}

然后,由于您可能希望在搜索之前显示它,因此将此行添加到TableViewController的viewDidLoad:

    [self searchDisplayControllerDidEndSearch:self.searchDisplayController];

为了记录,在开始工作之后,我最终使用单独的分段控件而不是上面的方法有几个原因,尤其是触摸SearchBar的ScopeBar后,一旦你显示它,启动搜索显示tableView,如果您以推荐的方式使用它,这是有道理的。但是,由于我希望ScopeBar能够在不启动搜索表视图的情况下工作,对我而言,使用我自己的分段控件并将其添加到searchBar下的tableHeaderView更有意义。