首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UISearchDisplayController:“取消”按钮

UISearchDisplayController:“取消”按钮
EN

Stack Overflow用户
提问于 2012-07-10 12:31:53
回答 1查看 2.4K关注 0票数 3

我对UISearchDisplayController有这个问题。我想在专用视图中使用它来处理搜索。对于我的控制器类,我使用了搜索栏、搜索控制器和tableviewcontroller的组合。SearchViewController链接到.xib

代码语言:javascript
复制
@interface SearchViewController : UIViewController <UISearchBarDelegate, UISearchDisplayDelegate, UITableViewDelegate, UITableViewDataSource> {
  NSSet *words;
  UISearchDisplayController *searchController;
  UISearchBar *searchBar;
  PhraseTableViewController *phraseTableViewController;
}

一旦SearchViewController出现,搜索栏就会成为第一个响应器,因此搜索是活动的。除了之外,一切看起来都很好,只有一个例外:为了回到前面的视图,我想使用SearchBar的cancel按钮。现在出现了一个问题:如果用户在没有进行搜索的情况下触及底层表视图的灰色区域,则取消按钮(因此也是返回的唯一方法)消失。

我想要解决的问题是:

  1. showsCancelButton = YES on searchDisplayControllerDidEndSearch.工作,但结果的UI是丑陋的地狱:取消按钮转换出来,然后重新出现。
  2. 将一个UITapGestureRecognizer添加到搜索控制器的searchResultTableView中,希望能捕捉到水龙头。不起作用,它还能通过。
  3. 子类UISearchBar和重写self.searchController.searchBar setShowsCancelButton: -没有工作。

如何解决这个问题:

  1. 始终隐藏“取消”按钮,而不是添加自定义按钮。问:你知道如何做这样的UI看起来很好吗?我最关心的是处理所有的情况,这样搜索-文本字段总是很好地保持在按钮的一侧。
  2. 为了一个更灵活的解决方案,把UISearchDisplayController放在一起。你知道去哪找吗?在iOS 3之前这个控制器根本不存在,对吧?难道没有解决办法仍然有效吗?

我很高兴你的任何意见。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-10 13:23:29

好的,我想我找到了一种可行的方法:我只是为正确的事件取消导航栏,这样用户就可以得到一个后退按钮。但是,请参阅下面的相关代码,但是我必须补充一点,一些事件处理是UISearchDisplayController的其他“特殊”行为的解决方案的一部分,这些行为会使导航条在错误的时间重新出现(在跳到一个细节页面之前,这也会导致难看的动画)。

编辑:是的,我知道这很难看--但如果你问我,那该死的UISearchDisplayController也是。

代码语言:javascript
复制
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];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11413389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档