UISearchDisplayController:取消为关闭按钮

时间:2012-07-10 12:31:54

标签: ios cocoa-touch uikit uisearchdisplaycontroller

我对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
  1. searchDisplayControllerDidEndSearch。可行,但结果用户界面很丑陋:取消按钮转出然后重新出现。
  2. UITapGestureRecognizer添加到搜索控件的searchResultTableView,希望能够抓住它。不起作用,它仍然存在。
  3. 子类UISearchBar并覆盖self.searchController.searchBar setShowsCancelButton: - 无效。
  4. 想法如何解决这个问题:

    1. 始终隐藏取消按钮,而是添加自定义按钮。问题:您是否知道如何做到这一点,UI看起来不错?最让我担心的是处理所有情况,使得搜索文本字段总是很好地保留在按钮的一侧。
    2. UISearchDisplayController放在一起以获得更灵活的解决方案。你知道在哪里看吗? iOS 3之前这个控制器不存在吧?周围没有解决方案吗?
    3. 我很高兴你的任何意见。提前谢谢。

1 个答案:

答案 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];
}