我对UISearchDisplayController
有这个问题。我想在专用视图中使用它来处理搜索。对于我的控制器类,我使用了搜索栏,searchcontroller和tableviewcontroller的组合。 SearchViewController链接到.xib
。
@interface SearchViewController : UIViewController <UISearchBarDelegate, UISearchDisplayDelegate, UITableViewDelegate, UITableViewDataSource> {
NSSet *words;
UISearchDisplayController *searchController;
UISearchBar *searchBar;
PhraseTableViewController *phraseTableViewController;
}
只要SearchViewController
出现,搜索栏就会成为第一响应者,因此搜索处于活动状态。一切看起来都很好,一个例外:
为了回到上一个视图,我想使用SearchBar的取消按钮。现在出现问题:如果用户在未进行搜索时触摸基础tableview的灰色区域,则取消按钮(因此也是唯一的返回方式)将消失。
这是我试图解决的问题:
showsCancelButton = YES
上searchDisplayControllerDidEndSearch
。可行,但结果用户界面很丑陋:取消按钮转出然后重新出现。UITapGestureRecognizer
添加到搜索控件的searchResultTableView
,希望能够抓住它。不起作用,它仍然存在。UISearchBar
并覆盖self.searchController.searchBar setShowsCancelButton:
- 无效。 想法如何解决这个问题:
UISearchDisplayController
放在一起以获得更灵活的解决方案。你知道在哪里看吗? iOS 3之前这个控制器不存在吧?周围没有解决方案吗?我很高兴你的任何意见。提前谢谢。
答案 0 :(得分:1)
好的我觉得我找到了一种有效的方法:我只是取消隐藏导航栏以获得正确的事件,以便用户获得一个后退按钮。请参阅下面的相关代码,但我必须补充说,某些事件处理是UISearchDisplayController
的其他“特殊”行为解决方案的一部分,这些行为会导致导航栏在错误的时间重新出现(在跳转到详细信息页面之前)这也会导致丑陋的动画。)
编辑:是的,我知道这很难看 - 但如果你问我,那该死的UISearchDisplayController也是如此。
static BOOL _cancelBtnClicked = NO;
static BOOL _phraseClicked = NO;
- (void)searchBarCancelButtonClicked:(UISearchBar *)_searchBar{
if(self.searchController.active){
_cancelBtnClicked = YES;
}else{
[self back];
}
}
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{
if(_cancelBtnClicked){
_cancelBtnClicked = NO;
[self back];
}
else if (!_phraseClicked) {
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}
- (void)keyboardWillHide:(NSNotification *)notification {
if (_phraseClicked) {
_phraseClicked = NO;
}
else if(self.isViewLoaded && self.view.window != nil) {
self.navigationController.navigationBar.hidden = YES;
}
}
- (void)hideNavbarAndKeepHidden {
self.navigationController.navigationBar.hidden = YES;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
_phraseClicked = YES;
[self.phraseTableViewController tableView:tableView didSelectRowAtIndexPath:indexPath];
}