3

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

@interface SearchViewController : UIViewController <UISearchBarDelegate, UISearchDisplayDelegate, UITableViewDelegate, UITableViewDataSource> {
  NSSet *words;
  UISearchDisplayController *searchController;
  UISearchBar *searchBar;
  PhraseTableViewController *phraseTableViewController;
}

一旦SearchViewController出现,搜索栏就会成为第一响应者,因此搜索处于活动状态。一切看起来都很好,但有一个例外: 为了返回上一个视图,我想使用 SearchBar 的取消按钮。现在问题来了:如果用户在没有进行搜索时触摸底层 tableview 的灰色区域,取消按钮(因此是返回的唯一方法)消失。

这是我试图解决的问题:

  1. showsCancelButton = YESsearchDisplayControllerDidEndSearch。有效,但生成的 UI 丑得要命:取消按钮转出然后重新出现。
  2. UITapGestureRecognizer在 searchcontroller中添加一个,searchResultTableView希望能抓住水龙头。没用,还是通过了。
  3. 子类UISearchBar和覆盖self.searchController.searchBar setShowsCancelButton:- 不起作用。

如何解决这个问题的想法:

  1. 始终隐藏取消按钮,而是添加自定义按钮。问题:您知道如何做到这一点以使 UI 看起来不错吗?我最关心的是处理所有情况,以便搜索文本字段始终很好地保持在按钮的一侧。
  2. 一起沟渠UISearchDisplayController以获得更灵活的解决方案。你知道去哪里看吗?在 iOS 3 之前,这个控制器不存在,对吧?周围没有解决方案仍然有效吗?

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

4

1 回答 1

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];
}
于 2012-07-10T13:23:29.763 回答