我目前正在尝试向我的应用添加一些搜索功能,但在配置时存在一些问题。我有一个基于标签的应用程序,包含3个tableviews,我想为所有表视图添加一个搜索栏。但是设置它似乎并不容易。
出现的第一个问题是,在Storyboard-Editor中我只能为每个tableview添加一个单独的搜索栏,但是无法将搜索栏添加到tabBarController本身。因此,在所有3个表视图中都可以看到相同的搜索栏。
第二个问题是,如果我得到一些工作方式,我必须设置一个包含3个不同的tableview的searchDisplayController,但我可以用一个tableview初始化一个searchDisplayController。
在iPhone上使用一个搜索栏搜索3个不同类别的最佳方法是什么?是否有任何教程?我也在看其他一些应用程序,比如facebook,他们也在一个桌面视图中搜索。
答案 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;
}