1

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

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

在视图 controller.h 中

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

在视图控制器.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,但仍然没有显示 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);
}
4

4 回答 4

5

您尝试的代码在 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 之间的视图层次结构不同,直接访问 index 处的对象可能会导致应用程序在 iOS6 中崩溃,为避免这种情况,仅在其 iOS7.0 时添加 if 条件。

此外,这在自定义搜索栏类中也是必需的

-(void) setShowsScopeBar:(BOOL)showsScopeBar {
    [super setShowsScopeBar:YES]; //Initially make search bar appear with scope bar
}
于 2014-01-20T11:27:51.260 回答
0

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

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

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

于 2013-11-19T06:06:56.927 回答
0

初始化设置范围栏 NO

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

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

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

在此处输入图像描述

于 2014-01-16T06:09:31.490 回答
0

在没有自定义搜索栏的情况下可以(但很笨拙)这样做,其方式与 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 更有意义。

于 2014-03-02T01:04:43.917 回答