IOS7:uisearchdisplaycontroller 总是显示范围栏

Posted

技术标签:

【中文标题】IOS7:uisearchdisplaycontroller 总是显示范围栏【英文标题】:IOS7 : uisearchdisplaycontroller always show scope bar 【发布时间】:2013-10-28 15:04:01 【问题描述】:

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

环境:ios 7,情节提要,在视图控制器内我有一个“搜索栏和搜索显示控制器”和一个单独的表格视图(搜索栏不在表格内)

在视图控制器.h内部

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

在view 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中log的输出是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);

【问题讨论】:

你在这方面有什么收获吗?我发现的解决方案仅适用于 iOS6,当我单击搜索栏时,范围栏会被隐藏,我不知道如何让它重新出现 你用storyboard还是nib @msec 关注我对 ios7 修复的回答。 【参考方案1】:

您尝试的代码在 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和iOS7的视图层次不同,直接访问索引处的对象可能会导致应用程序在iOS6中崩溃,为避免这种情况,只有在iOS7时才在if条件中添加。

此外,自定义搜索栏类中也需要这样做

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

【讨论】:

谢谢!!!在玩了一点代码之后,诀窍是取消注释一行代码并维护其余代码。这返回了所需的结果:D @msec 好的,我对我的代码进行了编辑。单独使用注释行更清楚。确保该行仅适用于 ios7。 我再次编辑,但仍需审核。您删除了所需的代码行之一,我还插入了 if 语句缺少的括号。此外,我添加了所有其他必要的代码 @msec 我认为最好将问题状态清楚地显示为范围栏,而不是您所做的所有其他编辑对于这个问题都是不必要的。 @msec 不需要那条线 man。你能在没有那条线的情况下检查一下吗【参考方案2】:

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

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

希望有人对此有解决方案;否则我们将不得不寻找解决方法。

【讨论】:

【参考方案3】:

初始化设置范围栏 NO

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

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

从 scopeBar 复选框中取消选择/删除勾选

【讨论】:

这似乎不起作用,您确定这将显示范围栏并在取消搜索后仍保持显示? 你搞砸了你的 searchDisplayControllerDidEndSearch。实际上你想要什么或你试图做什么 如果你能给我一个示例项目,我将不胜感激,我已经用各种方法尝试过你的代码,但似乎无法让它按照我想要的方式工作。如果这有什么不同,我会同时使用标签和导航栏 xib @iDev,我能够通过继承 UISearchBar 并使用此代码 - (void) setShowsScopeBar:(BOOL)showsScopeBar [super setShowsScopeBar:YES]; //Always show scope bar 使其首先出现,但这仅在我激活搜索栏之前有效。一旦我清除搜索,范围栏就会被隐藏,我似乎无法找回它 github.com/iDevandroid/TestSearchDisplayController这个故事板如果你想完全从xib告诉我【参考方案4】:

在没有自定义搜索栏的情况下也可以(但很笨拙)这样做,这与 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 在不启动搜索 tableview 的情况下工作,所以对我来说,使用我自己的分段控件并将其添加到 searchBar 下的 tableHeaderView 更有意义。

【讨论】:

以上是关于IOS7:uisearchdisplaycontroller 总是显示范围栏的主要内容,如果未能解决你的问题,请参考以下文章

iOS7状态栏问题

iOS7 的视图大小和位置

iOS7 和 Apple Watch

ios7之后的一些更改

iOS7隐藏状态栏

在ios7中绘图时出现延迟