使用UISearchBar \ UISearchDisplayViewController进行故障

时间:2013-09-23 17:53:11

标签: objective-c uisearchbar ios7

我在iOS 7上使用SearchDisplayViewController时遇到了困难。 我有一个隐藏在UITableViewController上的searchBar,比如

self.tableView.tableHeaderView = searchBar;

问题是,当我点击searchBar键入某个内容时,视图开始变灰,我会在随机点中快速点击屏幕以关闭它,返回tableView,搜索栏消失。完全。仅限iOS 7。

调试它,帧始终是相同的:0,0,320,44。但酒吧是看不见的!

也尝试过做

self.tableView.contentOffset = CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height);
当我快速完成时,

仍然消失。

在iOS 6上它运行得很好。问题只出现在我看到的iOS 7上。

我不知道它取决于什么,有没有人遇到过同样的问题?

4 个答案:

答案 0 :(得分:18)

Double tap UISearchBar with search delegate on iOS 7 causes UISearchBar to disappear开始,我找到了实际工作的解决方法并解决了错误 - 现在。

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}

答案 1 :(得分:4)

我遇到了同样的问题,并注意到searchDisplayControllerDidEndSearch被调用了两次。第一次,self.searchDisplayController.searchBar的超级视图是UITableView,第二次是UIView

根据接受的答案,我担心在每次搜索栏被双击时重新插入子视图会产生意外后果或不必要的开销,我也担心它会破坏未来的iOS版本。幸运的是,我们可以利用这样的superview奇怪:

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    if (self.tableView != self.searchDisplayController.searchBar.superview) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}

如果我不得不猜测发生了什么,UISearchBar会在活动时自动创建一个临时UIView作为其超级视图 - 这是执行搜索时看到的视图。当UISearchBar被解雇时,超级视图被重新设置为之前的UITableView除非它被如此快速地解散,以至于它从未被正确初始化,其中如果它不正确地清理,UITableView永远不会像其孩子那样得到UISearchBar

这个解决方案仍然不理想,我认为Apple必须在自己的应用程序中做一些不同的事情,因为他们的搜索栏UX感觉好一点。我认为最好不要在UISearchBar准备就绪之前先处理第二次点击。我尝试使用其他UISearchBarDelegate方法来执行此操作,但我找不到合适的挂钩来覆盖当前行为。

答案 2 :(得分:3)

我遇到了与iOS 7相同的问题,我从苹果文档中解决了这个问题。大多数人所犯的错误是他们将UISearchBar变量与self.searchDisplayController.searchBar相关联为......!不,不..!他们是两个不同的东西!应该声明并初始化UISearchBar,然后将其作为searchBar封装到self.searchDisplayController中,然后将其包装到self.tableView.tableHeaderView中,这样做就不会消失!!!

self.searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];

self.searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];

self.searchDisplayController.delegate = self;

self.searchDisplayController.searchResultsDataSource = self;

self.searchDisplayController.searchResultsDelegate = self;

[self.searchBar setPlaceholder:@"search the hell in me"];

self.tableView.tableHeaderView = self.searchDisplayController.searchBar; 

答案 3 :(得分:0)

@lehrblogger解决方案的更精细方法:

- (void)addSearchDisplayControllerBackToTableView {
    if ([self.searchDisplayController.searchBar isDescendantOfView:self.tableView] == NO) {
        NSLog(@"Search bar is not in current table view, will add it back");
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
        [self.searchDisplayController setActive:NO animated:YES];
    }
}

此方法的原因:搜索搜索栏时,搜索栏移动到搜索容器,搜索栏的超级视图始终是当前表视图以外的其他视图。

注意:这将取消搜索,因为用户在搜索栏上点击了多次。