9

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

self.tableView.tableHeaderView = searchBar;

问题是,当我点击 searchBar 输入内容时,视图开始变灰,我在随机点快速点击屏幕将其关闭,回到 tableView,searchBar 消失。完全。仅在 iOS 7 上。

调试一下,帧总是一样的:0,0,320,44。但是酒吧是看不见的!

也试过做

self.tableView.contentOffset = CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height);

当我快速完成时仍然会消失。

在 iOS 6 上它工作得很好。据我所知,问题仅出在 iOS 7 上。

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

4

4 回答 4

18

iOS 7 上使用搜索委托双击 UISearchBar 会导致 UISearchBar 消失,我找到了实际可行的解决方法并解决了这个错误 - 现在。

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}
于 2013-10-27T18:36:55.020 回答
4

我遇到了同样的问题,并注意到它searchDisplayControllerDidEndSearch被调用了两次。第一次,superviewself.searchDisplayController.searchBarUITableView,第二次仍然是 a 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作为它的子项返回。

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

于 2014-06-16T23:19:30.437 回答
3

我在 iOS 7 上遇到了同样的问题,我从苹果文档中解决了这个问题。大多数人犯的错误是他们将UISearchBar变量与self.searchDisplayController.searchBar相同...!不,不..!他们是两种不同的东西!!!UISearchBar应该声明和初始化,然后包装成self.searchDisplayControllersearchBar 然后再包装成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; 
于 2013-11-26T11:25:51.007 回答
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];
    }
}

采用这种方法的原因:在搜索时,搜索栏被移动到搜索容器,并且搜索栏的超级视图始终是当前表视图以外的其他视图。

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

于 2016-04-25T06:43:36.870 回答