如何将UISearchbar和Searchdisplaycontroller与多个tableviews一起使用?

时间:2013-01-19 18:21:04

标签: ios xcode cocoa-touch uitableview

我目前正在尝试向我的应用添加一些搜索功能,但在配置时存在一些问题。我有一个基于标签的应用程序,包含3个tableviews,我想为所有表视图添加一个搜索栏。但是设置它似乎并不容易。

出现的第一个问题是,在Storyboard-Editor中我只能为每个tableview添加一个单独的搜索栏,但是无法将搜索栏添加到tabBarController本身。因此,在所有3个表视图中都可以看到相同的搜索栏。

第二个问题是,如果我得到一些工作方式,我必须设置一个包含3个不同的tableview的searchDisplayController,但我可以用一个tableview初始化一个searchDisplayController。

在iPhone上使用一个搜索栏搜索3个不同类别的最佳方法是什么?是否有任何教程?我也在看其他一些应用程序,比如facebook,他们也在一个桌面视图中搜索。

2 个答案:

答案 0 :(得分:1)

您可以使用以下三个搜索显示控制器:让每个选项卡上的每个vc实现一个方法(并公开声明),如下所示:

- (void)searchFor:(NSString *)string {
    [self.searchDisplayController setActive:YES];
    self.searchDisplayController.searchBar.text = string;
}

每个都应该实现这个方法:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {

    // do the search logic for my table
    // set a badge on my tab indicating how many results I found

    // then perform it on the other vcs:
    NSMutableArray *otherVCs = [[self.tabBarController viewControllers] mutableCopy];
    [otherVCs removeObject:self];

    for (MyViewController *otherVC in otherVCs) {
        [otherVC searchFor:searchString];
    }
}

您可能需要确保已加载所有其他选项卡vcs(如果启动应用程序,只访问一个选项卡并尝试此操作,其他vcs可能尚未就绪。要执行此操作,只需在循环中插入此行强制加载视图:(void)[otherVC view];

(注意 - 这个答案假定ARC)

答案 1 :(得分:0)

此解决方案存在一些问题。它会导致无限循环。解决方案是我们必须证明视图是否可见。

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self setUpFilteredEndlessScrollingWithUrl:kGetAllTours];
    [self loadFilteredDataWithPath:kGetAllTours];
    if (self.isViewLoaded && self.view.window) {
        NSMutableArray *otherVCs = [[self.tabBarController viewControllers] mutableCopy];
        [otherVCs removeObject:self];

        for (BaseTableViewController *otherVC in otherVCs) {
            [otherVC searchFor:searchString];
        }
    }
    return YES;
}